/* * GPAC - Multimedia Framework C SDK * * Authors: Jean Le Feuvre * Copyright (c) Telecom ParisTech 2007-2012 * All rights reserved * * This file is part of GPAC / common tools sub-project * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include <gpac/utf.h> /*------------------------------------------------------------------------ Bidirectional Character Types as defined by the Unicode Bidirectional Algorithm Table 3-7. ------------------------------------------------------------------------*/ enum { // input types // ON MUST be zero, code relies on ON = N = 0 ON = 0, // Other Neutral L, // Left Letter R, // Right Letter AN, // Arabic Number EN, // European Number AL, // Arabic Letter (Right-to-left) NSM, // Non-spacing Mark CS, // Common Separator ES, // European Separator ET, // European Terminator (post/prefix e.g. $ and %) // resolved types BN, // Boundary neutral (type of RLE etc after explicit levels) // input types, S, // Segment Separator (TAB) // used only in L1 WS, // White space // used only in L1 B, // Paragraph Separator (aka as PS) // types for explicit controls RLO, // these are used only in X1-X9 RLE, LRO, LRE, PDF, // resolved types, also resolved directions N = ON, // alias, where ON, WS and S are treated the same }; /*---------------------------------------------------------------------- The following array maps character codes to types for the purpose of this sample implementation. The legend string gives a human readable explanation of the pseudo alphabet. For simplicity, characters entered by buttons are given a 1:1 mapping between their type and pseudo character value. Pseudo characters that can be typed from the keyboard are explained in the legend string. Use the Unicode Character Database for the real values in real use. ---------------------------------------------------------------------*/ #define LRM 4 #define RLM 5 #define LS 0x13 static int bidi_get_class(u32 val); GF_EXPORT Bool gf_utf8_is_right_to_left(u16 *utf_string) { u32 i = 0; while (1) { u32 c = utf_string[i]; if (!c) return GF_FALSE; switch (bidi_get_class(c)) { case L: return GF_FALSE; case R: return GF_TRUE; case AN: return GF_TRUE; case EN: return GF_FALSE; case AL: return GF_TRUE; default: break; } i++; } return GF_FALSE; } /*a very VERY basic bidi reorderer */ GF_EXPORT Bool gf_utf8_reorder_bidi(u16 *utf_string, u32 len) { u32 i, j, start, stop, cur_dir, slen, main_dir; Bool is_start; /*get main direction of the layour*/ Bool rev = gf_utf8_is_right_to_left(utf_string); if (rev) { for (i=0; i<len/2; i++) { u32 v = utf_string[i]; utf_string[i] = utf_string[len-1-i]; utf_string[len-1-i] = v; } } cur_dir = rev ? 1 : 0; main_dir = cur_dir; is_start = GF_TRUE; start = stop = 0; for (i=0; i<len; i++) { Bool rtl; u32 c = bidi_get_class(utf_string[i]); switch (c) { case R: case AN: case AL: rtl = GF_TRUE; break; case L: case EN: rtl = GF_FALSE; break; default: if (is_start) { start = i; } else if (!stop) { stop = i; } continue; } if (cur_dir != rtl) { if (!stop) stop = i; if (is_start) { is_start = GF_FALSE; } else { is_start = GF_TRUE; if (main_dir != cur_dir) { slen = stop-start+1; for (j=0; j<slen/2; j++) { u32 v = utf_string[start + j]; utf_string[start + j] = utf_string[stop-j]; utf_string[stop-j] = v; } } } cur_dir = rtl; } stop = 0; } /*not flushed yet*/ if (!is_start) { if (!stop) stop = len-1; slen = stop-start+1; for (j=0; j<slen/2; j++) { u32 v = utf_string[start + j]; utf_string[start + j] = utf_string[stop-j]; utf_string[stop-j] = v; } } return rev; } static int bidi_get_class(u32 val) { if ((val>=0x0041) && (val<=0x005A)) return L; //# L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z if ((val>=0x0061) && (val<=0x007A)) return L; //# L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z if (val==0x000000AA) return L; //# L& FEMININE ORDINAL INDICATOR if (val==0x000000B5) return L; //# L& MICRO SIGN if (val==0x000000BA) return L; //# L& MASCULINE ORDINAL INDICATOR if ((val>=0x00C0) && (val<=0x00D6)) return L; //# L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS if ((val>=0x00D8) && (val<=0x00F6)) return L; //# L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS if ((val>=0x00F8) && (val<=0x01BA)) return L; //# L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL if (val==0x000001BB) return L; //# Lo LATIN LETTER TWO WITH STROKE if ((val>=0x01BC) && (val<=0x01BF)) return L; //# L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN if ((val>=0x01C0) && (val<=0x01C3)) return L; //# Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK if ((val>=0x01C4) && (val<=0x0293)) return L; //# L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL if (val==0x00000294) return L; //# Lo LATIN LETTER GLOTTAL STOP if ((val>=0x0295) && (val<=0x02AF)) return L; //# L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL if ((val>=0x02B0) && (val<=0x02B8)) return L; //# Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y if ((val>=0x02BB) && (val<=0x02C1)) return L; //# Lm [7] MODIFIER LETTER TURNED COMMA..MODIFIER LETTER REVERSED GLOTTAL STOP if ((val>=0x02D0) && (val<=0x02D1)) return L; //# Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON if ((val>=0x02E0) && (val<=0x02E4)) return L; //# Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP if (val==0x000002EE) return L; //# Lm MODIFIER LETTER DOUBLE APOSTROPHE if (val==0x0000037A) return L; //# Lm GREEK YPOGEGRAMMENI if ((val>=0x037B) && (val<=0x037D)) return L; //# L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL if (val==0x00000386) return L; //# L& GREEK CAPITAL LETTER ALPHA WITH TONOS if ((val>=0x0388) && (val<=0x038A)) return L; //# L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS if (val==0x0000038C) return L; //# L& GREEK CAPITAL LETTER OMICRON WITH TONOS if ((val>=0x038E) && (val<=0x03A1)) return L; //# L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO if ((val>=0x03A3) && (val<=0x03CE)) return L; //# L& [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS if ((val>=0x03D0) && (val<=0x03F5)) return L; //# L& [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL if ((val>=0x03F7) && (val<=0x0481)) return L; //# L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA if (val==0x00000482) return L; //# So CYRILLIC THOUSANDS SIGN if ((val>=0x048A) && (val<=0x0513)) return L; //# L& [138] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH HOOK if ((val>=0x0531) && (val<=0x0556)) return L; //# L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH if (val==0x00000559) return L; //# Lm ARMENIAN MODIFIER LETTER LEFT HALF RING if ((val>=0x055A) && (val<=0x055F)) return L; //# Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK if ((val>=0x0561) && (val<=0x0587)) return L; //# L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN if (val==0x00000589) return L; //# Po ARMENIAN FULL STOP if (val==0x00000903) return L; //# Mc DEVANAGARI SIGN VISARGA if ((val>=0x0904) && (val<=0x0939)) return L; //# Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA if (val==0x0000093D) return L; //# Lo DEVANAGARI SIGN AVAGRAHA if ((val>=0x093E) && (val<=0x0940)) return L; //# Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II if ((val>=0x0949) && (val<=0x094C)) return L; //# Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU if (val==0x00000950) return L; //# Lo DEVANAGARI OM if ((val>=0x0958) && (val<=0x0961)) return L; //# Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL if ((val>=0x0964) && (val<=0x0965)) return L; //# Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA if ((val>=0x0966) && (val<=0x096F)) return L; //# Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE if (val==0x00000970) return L; //# Po DEVANAGARI ABBREVIATION SIGN if ((val>=0x097B) && (val<=0x097F)) return L; //# Lo [5] DEVANAGARI LETTER GGA..DEVANAGARI LETTER BBA if ((val>=0x0982) && (val<=0x0983)) return L; //# Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA if ((val>=0x0985) && (val<=0x098C)) return L; //# Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L if ((val>=0x098F) && (val<=0x0990)) return L; //# Lo [2] BENGALI LETTER E..BENGALI LETTER AI if ((val>=0x0993) && (val<=0x09A8)) return L; //# Lo [22] BENGALI LETTER O..BENGALI LETTER NA if ((val>=0x09AA) && (val<=0x09B0)) return L; //# Lo [7] BENGALI LETTER PA..BENGALI LETTER RA if (val==0x000009B2) return L; //# Lo BENGALI LETTER LA if ((val>=0x09B6) && (val<=0x09B9)) return L; //# Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA if (val==0x000009BD) return L; //# Lo BENGALI SIGN AVAGRAHA if ((val>=0x09BE) && (val<=0x09C0)) return L; //# Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II if ((val>=0x09C7) && (val<=0x09C8)) return L; //# Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI if ((val>=0x09CB) && (val<=0x09CC)) return L; //# Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU if (val==0x000009CE) return L; //# Lo BENGALI LETTER KHANDA TA if (val==0x000009D7) return L; //# Mc BENGALI AU LENGTH MARK if ((val>=0x09DC) && (val<=0x09DD)) return L; //# Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA if ((val>=0x09DF) && (val<=0x09E1)) return L; //# Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL if ((val>=0x09E6) && (val<=0x09EF)) return L; //# Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE if ((val>=0x09F0) && (val<=0x09F1)) return L; //# Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL if ((val>=0x09F4) && (val<=0x09F9)) return L; //# No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN if (val==0x000009FA) return L; //# So BENGALI ISSHAR if (val==0x00000A03) return L; //# Mc GURMUKHI SIGN VISARGA if ((val>=0x0A05) && (val<=0x0A0A)) return L; //# Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU if ((val>=0x0A0F) && (val<=0x0A10)) return L; //# Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI if ((val>=0x0A13) && (val<=0x0A28)) return L; //# Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA if ((val>=0x0A2A) && (val<=0x0A30)) return L; //# Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA if ((val>=0x0A32) && (val<=0x0A33)) return L; //# Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA if ((val>=0x0A35) && (val<=0x0A36)) return L; //# Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA if ((val>=0x0A38) && (val<=0x0A39)) return L; //# Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA if ((val>=0x0A3E) && (val<=0x0A40)) return L; //# Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II if ((val>=0x0A59) && (val<=0x0A5C)) return L; //# Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA if (val==0x00000A5E) return L; //# Lo GURMUKHI LETTER FA if ((val>=0x0A66) && (val<=0x0A6F)) return L; //# Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE if ((val>=0x0A72) && (val<=0x0A74)) return L; //# Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR if (val==0x00000A83) return L; //# Mc GUJARATI SIGN VISARGA if ((val>=0x0A85) && (val<=0x0A8D)) return L; //# Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E if ((val>=0x0A8F) && (val<=0x0A91)) return L; //# Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O if ((val>=0x0A93) && (val<=0x0AA8)) return L; //# Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA if ((val>=0x0AAA) && (val<=0x0AB0)) return L; //# Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA if ((val>=0x0AB2) && (val<=0x0AB3)) return L; //# Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA if ((val>=0x0AB5) && (val<=0x0AB9)) return L; //# Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA if (val==0x00000ABD) return L; //# Lo GUJARATI SIGN AVAGRAHA if ((val>=0x0ABE) && (val<=0x0AC0)) return L; //# Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II if (val==0x00000AC9) return L; //# Mc GUJARATI VOWEL SIGN CANDRA O if ((val>=0x0ACB) && (val<=0x0ACC)) return L; //# Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU if (val==0x00000AD0) return L; //# Lo GUJARATI OM if ((val>=0x0AE0) && (val<=0x0AE1)) return L; //# Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL if ((val>=0x0AE6) && (val<=0x0AEF)) return L; //# Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE if ((val>=0x0B02) && (val<=0x0B03)) return L; //# Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA if ((val>=0x0B05) && (val<=0x0B0C)) return L; //# Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L if ((val>=0x0B0F) && (val<=0x0B10)) return L; //# Lo [2] ORIYA LETTER E..ORIYA LETTER AI if ((val>=0x0B13) && (val<=0x0B28)) return L; //# Lo [22] ORIYA LETTER O..ORIYA LETTER NA if ((val>=0x0B2A) && (val<=0x0B30)) return L; //# Lo [7] ORIYA LETTER PA..ORIYA LETTER RA if ((val>=0x0B32) && (val<=0x0B33)) return L; //# Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA if ((val>=0x0B35) && (val<=0x0B39)) return L; //# Lo [5] ORIYA LETTER VA..ORIYA LETTER HA if (val==0x00000B3D) return L; //# Lo ORIYA SIGN AVAGRAHA if (val==0x00000B3E) return L; //# Mc ORIYA VOWEL SIGN AA if (val==0x00000B40) return L; //# Mc ORIYA VOWEL SIGN II if ((val>=0x0B47) && (val<=0x0B48)) return L; //# Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI if ((val>=0x0B4B) && (val<=0x0B4C)) return L; //# Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU if (val==0x00000B57) return L; //# Mc ORIYA AU LENGTH MARK if ((val>=0x0B5C) && (val<=0x0B5D)) return L; //# Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA if ((val>=0x0B5F) && (val<=0x0B61)) return L; //# Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL if ((val>=0x0B66) && (val<=0x0B6F)) return L; //# Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE if (val==0x00000B70) return L; //# So ORIYA ISSHAR if (val==0x00000B71) return L; //# Lo ORIYA LETTER WA if (val==0x00000B83) return L; //# Lo TAMIL SIGN VISARGA if ((val>=0x0B85) && (val<=0x0B8A)) return L; //# Lo [6] TAMIL LETTER A..TAMIL LETTER UU if ((val>=0x0B8E) && (val<=0x0B90)) return L; //# Lo [3] TAMIL LETTER E..TAMIL LETTER AI if ((val>=0x0B92) && (val<=0x0B95)) return L; //# Lo [4] TAMIL LETTER O..TAMIL LETTER KA if ((val>=0x0B99) && (val<=0x0B9A)) return L; //# Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA if (val==0x00000B9C) return L; //# Lo TAMIL LETTER JA if ((val>=0x0B9E) && (val<=0x0B9F)) return L; //# Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA if ((val>=0x0BA3) && (val<=0x0BA4)) return L; //# Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA if ((val>=0x0BA8) && (val<=0x0BAA)) return L; //# Lo [3] TAMIL LETTER NA..TAMIL LETTER PA if ((val>=0x0BAE) && (val<=0x0BB9)) return L; //# Lo [12] TAMIL LETTER MA..TAMIL LETTER HA if ((val>=0x0BBE) && (val<=0x0BBF)) return L; //# Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I if ((val>=0x0BC1) && (val<=0x0BC2)) return L; //# Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU if ((val>=0x0BC6) && (val<=0x0BC8)) return L; //# Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI if ((val>=0x0BCA) && (val<=0x0BCC)) return L; //# Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU if (val==0x00000BD7) return L; //# Mc TAMIL AU LENGTH MARK if ((val>=0x0BE6) && (val<=0x0BEF)) return L; //# Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE if ((val>=0x0BF0) && (val<=0x0BF2)) return L; //# No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND if ((val>=0x0C01) && (val<=0x0C03)) return L; //# Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA if ((val>=0x0C05) && (val<=0x0C0C)) return L; //# Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L if ((val>=0x0C0E) && (val<=0x0C10)) return L; //# Lo [3] TELUGU LETTER E..TELUGU LETTER AI if ((val>=0x0C12) && (val<=0x0C28)) return L; //# Lo [23] TELUGU LETTER O..TELUGU LETTER NA if ((val>=0x0C2A) && (val<=0x0C33)) return L; //# Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA if ((val>=0x0C35) && (val<=0x0C39)) return L; //# Lo [5] TELUGU LETTER VA..TELUGU LETTER HA if ((val>=0x0C41) && (val<=0x0C44)) return L; //# Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR if ((val>=0x0C60) && (val<=0x0C61)) return L; //# Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL if ((val>=0x0C66) && (val<=0x0C6F)) return L; //# Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE if ((val>=0x0C82) && (val<=0x0C83)) return L; //# Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA if ((val>=0x0C85) && (val<=0x0C8C)) return L; //# Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L if ((val>=0x0C8E) && (val<=0x0C90)) return L; //# Lo [3] KANNADA LETTER E..KANNADA LETTER AI if ((val>=0x0C92) && (val<=0x0CA8)) return L; //# Lo [23] KANNADA LETTER O..KANNADA LETTER NA if ((val>=0x0CAA) && (val<=0x0CB3)) return L; //# Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA if ((val>=0x0CB5) && (val<=0x0CB9)) return L; //# Lo [5] KANNADA LETTER VA..KANNADA LETTER HA if (val==0x00000CBD) return L; //# Lo KANNADA SIGN AVAGRAHA if (val==0x00000CBE) return L; //# Mc KANNADA VOWEL SIGN AA if (val==0x00000CBF) return L; //# Mn KANNADA VOWEL SIGN I if ((val>=0x0CC0) && (val<=0x0CC4)) return L; //# Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR if (val==0x00000CC6) return L; //# Mn KANNADA VOWEL SIGN E if ((val>=0x0CC7) && (val<=0x0CC8)) return L; //# Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI if ((val>=0x0CCA) && (val<=0x0CCB)) return L; //# Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO if ((val>=0x0CD5) && (val<=0x0CD6)) return L; //# Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK if (val==0x00000CDE) return L; //# Lo KANNADA LETTER FA if ((val>=0x0CE0) && (val<=0x0CE1)) return L; //# Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL if ((val>=0x0CE6) && (val<=0x0CEF)) return L; //# Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE if ((val>=0x0D02) && (val<=0x0D03)) return L; //# Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA if ((val>=0x0D05) && (val<=0x0D0C)) return L; //# Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L if ((val>=0x0D0E) && (val<=0x0D10)) return L; //# Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI if ((val>=0x0D12) && (val<=0x0D28)) return L; //# Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA if ((val>=0x0D2A) && (val<=0x0D39)) return L; //# Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA if ((val>=0x0D3E) && (val<=0x0D40)) return L; //# Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II if ((val>=0x0D46) && (val<=0x0D48)) return L; //# Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI if ((val>=0x0D4A) && (val<=0x0D4C)) return L; //# Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU if (val==0x00000D57) return L; //# Mc MALAYALAM AU LENGTH MARK if ((val>=0x0D60) && (val<=0x0D61)) return L; //# Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL if ((val>=0x0D66) && (val<=0x0D6F)) return L; //# Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE if ((val>=0x0D82) && (val<=0x0D83)) return L; //# Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA if ((val>=0x0D85) && (val<=0x0D96)) return L; //# Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA if ((val>=0x0D9A) && (val<=0x0DB1)) return L; //# Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA if ((val>=0x0DB3) && (val<=0x0DBB)) return L; //# Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA if (val==0x00000DBD) return L; //# Lo SINHALA LETTER DANTAJA LAYANNA if ((val>=0x0DC0) && (val<=0x0DC6)) return L; //# Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA if ((val>=0x0DCF) && (val<=0x0DD1)) return L; //# Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA if ((val>=0x0DD8) && (val<=0x0DDF)) return L; //# Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA if ((val>=0x0DF2) && (val<=0x0DF3)) return L; //# Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA if (val==0x00000DF4) return L; //# Po SINHALA PUNCTUATION KUNDDALIYA if ((val>=0x0E01) && (val<=0x0E30)) return L; //# Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A if ((val>=0x0E32) && (val<=0x0E33)) return L; //# Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM if ((val>=0x0E40) && (val<=0x0E45)) return L; //# Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO if (val==0x00000E46) return L; //# Lm THAI CHARACTER MAIYAMOK if (val==0x00000E4F) return L; //# Po THAI CHARACTER FONGMAN if ((val>=0x0E50) && (val<=0x0E59)) return L; //# Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE if ((val>=0x0E5A) && (val<=0x0E5B)) return L; //# Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT if ((val>=0x0E81) && (val<=0x0E82)) return L; //# Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG if (val==0x00000E84) return L; //# Lo LAO LETTER KHO TAM if ((val>=0x0E87) && (val<=0x0E88)) return L; //# Lo [2] LAO LETTER NGO..LAO LETTER CO if (val==0x00000E8A) return L; //# Lo LAO LETTER SO TAM if (val==0x00000E8D) return L; //# Lo LAO LETTER NYO if ((val>=0x0E94) && (val<=0x0E97)) return L; //# Lo [4] LAO LETTER DO..LAO LETTER THO TAM if ((val>=0x0E99) && (val<=0x0E9F)) return L; //# Lo [7] LAO LETTER NO..LAO LETTER FO SUNG if ((val>=0x0EA1) && (val<=0x0EA3)) return L; //# Lo [3] LAO LETTER MO..LAO LETTER LO LING if (val==0x00000EA5) return L; //# Lo LAO LETTER LO LOOT if (val==0x00000EA7) return L; //# Lo LAO LETTER WO if ((val>=0x0EAA) && (val<=0x0EAB)) return L; //# Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG if ((val>=0x0EAD) && (val<=0x0EB0)) return L; //# Lo [4] LAO LETTER O..LAO VOWEL SIGN A if ((val>=0x0EB2) && (val<=0x0EB3)) return L; //# Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM if (val==0x00000EBD) return L; //# Lo LAO SEMIVOWEL SIGN NYO if ((val>=0x0EC0) && (val<=0x0EC4)) return L; //# Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI if (val==0x00000EC6) return L; //# Lm LAO KO LA if ((val>=0x0ED0) && (val<=0x0ED9)) return L; //# Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE if ((val>=0x0EDC) && (val<=0x0EDD)) return L; //# Lo [2] LAO HO NO..LAO HO MO if (val==0x00000F00) return L; //# Lo TIBETAN SYLLABLE OM if ((val>=0x0F01) && (val<=0x0F03)) return L; //# So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA if ((val>=0x0F04) && (val<=0x0F12)) return L; //# Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD if ((val>=0x0F13) && (val<=0x0F17)) return L; //# So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS if ((val>=0x0F1A) && (val<=0x0F1F)) return L; //# So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG if ((val>=0x0F20) && (val<=0x0F29)) return L; //# Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE if ((val>=0x0F2A) && (val<=0x0F33)) return L; //# No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO if (val==0x00000F34) return L; //# So TIBETAN MARK BSDUS RTAGS if (val==0x00000F36) return L; //# So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN if (val==0x00000F38) return L; //# So TIBETAN MARK CHE MGO if ((val>=0x0F3E) && (val<=0x0F3F)) return L; //# Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES if ((val>=0x0F40) && (val<=0x0F47)) return L; //# Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA if ((val>=0x0F49) && (val<=0x0F6A)) return L; //# Lo [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA if (val==0x00000F7F) return L; //# Mc TIBETAN SIGN RNAM BCAD if (val==0x00000F85) return L; //# Po TIBETAN MARK PALUTA if ((val>=0x0F88) && (val<=0x0F8B)) return L; //# Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS if ((val>=0x0FBE) && (val<=0x0FC5)) return L; //# So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE if ((val>=0x0FC7) && (val<=0x0FCC)) return L; //# So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL if (val==0x00000FCF) return L; //# So TIBETAN SIGN RDEL NAG GSUM if ((val>=0x0FD0) && (val<=0x0FD1)) return L; //# Po [2] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN if ((val>=0x1000) && (val<=0x1021)) return L; //# Lo [34] MYANMAR LETTER KA..MYANMAR LETTER A if ((val>=0x1023) && (val<=0x1027)) return L; //# Lo [5] MYANMAR LETTER I..MYANMAR LETTER E if ((val>=0x1029) && (val<=0x102A)) return L; //# Lo [2] MYANMAR LETTER O..MYANMAR LETTER AU if (val==0x0000102C) return L; //# Mc MYANMAR VOWEL SIGN AA if (val==0x00001031) return L; //# Mc MYANMAR VOWEL SIGN E if (val==0x00001038) return L; //# Mc MYANMAR SIGN VISARGA if ((val>=0x1040) && (val<=0x1049)) return L; //# Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE if ((val>=0x104A) && (val<=0x104F)) return L; //# Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE if ((val>=0x1050) && (val<=0x1055)) return L; //# Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL if ((val>=0x1056) && (val<=0x1057)) return L; //# Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR if ((val>=0x10A0) && (val<=0x10C5)) return L; //# L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE if ((val>=0x10D0) && (val<=0x10FA)) return L; //# Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN if (val==0x000010FB) return L; //# Po GEORGIAN PARAGRAPH SEPARATOR if (val==0x000010FC) return L; //# Lm MODIFIER LETTER GEORGIAN NAR if ((val>=0x1100) && (val<=0x1159)) return L; //# Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH if ((val>=0x115F) && (val<=0x11A2)) return L; //# Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA if ((val>=0x11A8) && (val<=0x11F9)) return L; //# Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH if ((val>=0x1200) && (val<=0x1248)) return L; //# Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA if ((val>=0x124A) && (val<=0x124D)) return L; //# Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE if ((val>=0x1250) && (val<=0x1256)) return L; //# Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO if (val==0x00001258) return L; //# Lo ETHIOPIC SYLLABLE QHWA if ((val>=0x125A) && (val<=0x125D)) return L; //# Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE if ((val>=0x1260) && (val<=0x1288)) return L; //# Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA if ((val>=0x128A) && (val<=0x128D)) return L; //# Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE if ((val>=0x1290) && (val<=0x12B0)) return L; //# Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA if ((val>=0x12B2) && (val<=0x12B5)) return L; //# Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE if ((val>=0x12B8) && (val<=0x12BE)) return L; //# Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO if (val==0x000012C0) return L; //# Lo ETHIOPIC SYLLABLE KXWA if ((val>=0x12C2) && (val<=0x12C5)) return L; //# Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE if ((val>=0x12C8) && (val<=0x12D6)) return L; //# Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O if ((val>=0x12D8) && (val<=0x1310)) return L; //# Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA if ((val>=0x1312) && (val<=0x1315)) return L; //# Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE if ((val>=0x1318) && (val<=0x135A)) return L; //# Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA if (val==0x00001360) return L; //# So ETHIOPIC SECTION MARK if ((val>=0x1361) && (val<=0x1368)) return L; //# Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR if ((val>=0x1369) && (val<=0x137C)) return L; //# No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND if ((val>=0x1380) && (val<=0x138F)) return L; //# Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE if ((val>=0x13A0) && (val<=0x13F4)) return L; //# Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV if ((val>=0x1401) && (val<=0x166C)) return L; //# Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA if ((val>=0x166D) && (val<=0x166E)) return L; //# Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP if ((val>=0x166F) && (val<=0x1676)) return L; //# Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA if ((val>=0x1681) && (val<=0x169A)) return L; //# Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH if ((val>=0x16A0) && (val<=0x16EA)) return L; //# Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X if ((val>=0x16EB) && (val<=0x16ED)) return L; //# Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION if ((val>=0x16EE) && (val<=0x16F0)) return L; //# Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL if ((val>=0x1700) && (val<=0x170C)) return L; //# Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA if ((val>=0x170E) && (val<=0x1711)) return L; //# Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA if ((val>=0x1720) && (val<=0x1731)) return L; //# Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA if ((val>=0x1735) && (val<=0x1736)) return L; //# Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION if ((val>=0x1740) && (val<=0x1751)) return L; //# Lo [18] BUHID LETTER A..BUHID LETTER HA if ((val>=0x1760) && (val<=0x176C)) return L; //# Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA if ((val>=0x176E) && (val<=0x1770)) return L; //# Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA if ((val>=0x1780) && (val<=0x17B3)) return L; //# Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU if ((val>=0x17B4) && (val<=0x17B5)) return L; //# Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA if (val==0x000017B6) return L; //# Mc KHMER VOWEL SIGN AA if ((val>=0x17BE) && (val<=0x17C5)) return L; //# Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU if ((val>=0x17C7) && (val<=0x17C8)) return L; //# Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU if ((val>=0x17D4) && (val<=0x17D6)) return L; //# Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH if (val==0x000017D7) return L; //# Lm KHMER SIGN LEK TOO if ((val>=0x17D8) && (val<=0x17DA)) return L; //# Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT if (val==0x000017DC) return L; //# Lo KHMER SIGN AVAKRAHASANYA if ((val>=0x17E0) && (val<=0x17E9)) return L; //# Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE if ((val>=0x1810) && (val<=0x1819)) return L; //# Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE if ((val>=0x1820) && (val<=0x1842)) return L; //# Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI if (val==0x00001843) return L; //# Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN if ((val>=0x1844) && (val<=0x1877)) return L; //# Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA if ((val>=0x1880) && (val<=0x18A8)) return L; //# Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA if ((val>=0x1900) && (val<=0x191C)) return L; //# Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA if ((val>=0x1923) && (val<=0x1926)) return L; //# Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU if ((val>=0x1930) && (val<=0x1931)) return L; //# Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA if ((val>=0x1933) && (val<=0x1938)) return L; //# Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA if ((val>=0x1946) && (val<=0x194F)) return L; //# Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE if ((val>=0x1950) && (val<=0x196D)) return L; //# Lo [30] TAI LE LETTER KA..TAI LE LETTER AI if ((val>=0x1970) && (val<=0x1974)) return L; //# Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 if ((val>=0x1980) && (val<=0x19A9)) return L; //# Lo [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA if ((val>=0x19B0) && (val<=0x19C0)) return L; //# Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY if ((val>=0x19C1) && (val<=0x19C7)) return L; //# Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B if ((val>=0x19C8) && (val<=0x19C9)) return L; //# Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2 if ((val>=0x19D0) && (val<=0x19D9)) return L; //# Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE if ((val>=0x1A00) && (val<=0x1A16)) return L; //# Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA if ((val>=0x1A19) && (val<=0x1A1B)) return L; //# Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE if ((val>=0x1A1E) && (val<=0x1A1F)) return L; //# Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION if (val==0x00001B04) return L; //# Mc BALINESE SIGN BISAH if ((val>=0x1B05) && (val<=0x1B33)) return L; //# Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA if (val==0x00001B35) return L; //# Mc BALINESE VOWEL SIGN TEDUNG if (val==0x00001B3B) return L; //# Mc BALINESE VOWEL SIGN RA REPA TEDUNG if ((val>=0x1B3D) && (val<=0x1B41)) return L; //# Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG if ((val>=0x1B43) && (val<=0x1B44)) return L; //# Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG if ((val>=0x1B45) && (val<=0x1B4B)) return L; //# Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK if ((val>=0x1B50) && (val<=0x1B59)) return L; //# Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE if ((val>=0x1B5A) && (val<=0x1B60)) return L; //# Po [7] BALINESE PANTI..BALINESE PAMENENG if ((val>=0x1B61) && (val<=0x1B6A)) return L; //# So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE if ((val>=0x1B74) && (val<=0x1B7C)) return L; //# So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING if ((val>=0x1D00) && (val<=0x1D2B)) return L; //# L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL if ((val>=0x1D2C) && (val<=0x1D61)) return L; //# Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI if ((val>=0x1D62) && (val<=0x1D77)) return L; //# L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G if (val==0x00001D78) return L; //# Lm MODIFIER LETTER CYRILLIC EN if ((val>=0x1D79) && (val<=0x1D9A)) return L; //# L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK if ((val>=0x1D9B) && (val<=0x1DBF)) return L; //# Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA if ((val>=0x1E00) && (val<=0x1E9B)) return L; //# L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE if ((val>=0x1EA0) && (val<=0x1EF9)) return L; //# L& [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE if ((val>=0x1F00) && (val<=0x1F15)) return L; //# L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA if ((val>=0x1F18) && (val<=0x1F1D)) return L; //# L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA if ((val>=0x1F20) && (val<=0x1F45)) return L; //# L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA if ((val>=0x1F48) && (val<=0x1F4D)) return L; //# L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA if ((val>=0x1F50) && (val<=0x1F57)) return L; //# L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI if (val==0x00001F59) return L; //# L& GREEK CAPITAL LETTER UPSILON WITH DASIA if (val==0x00001F5B) return L; //# L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA if (val==0x00001F5D) return L; //# L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA if ((val>=0x1F5F) && (val<=0x1F7D)) return L; //# L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA if ((val>=0x1F80) && (val<=0x1FB4)) return L; //# L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI if ((val>=0x1FB6) && (val<=0x1FBC)) return L; //# L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI if (val==0x00001FBE) return L; //# L& GREEK PROSGEGRAMMENI if ((val>=0x1FC2) && (val<=0x1FC4)) return L; //# L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI if ((val>=0x1FC6) && (val<=0x1FCC)) return L; //# L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI if ((val>=0x1FD0) && (val<=0x1FD3)) return L; //# L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA if ((val>=0x1FD6) && (val<=0x1FDB)) return L; //# L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA if ((val>=0x1FE0) && (val<=0x1FEC)) return L; //# L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA if ((val>=0x1FF2) && (val<=0x1FF4)) return L; //# L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI if ((val>=0x1FF6) && (val<=0x1FFC)) return L; //# L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI if (val==0x0000200E) return L; //# Cf LEFT-TO-RIGHT MARK if (val==0x00002071) return L; //# L& SUPERSCRIPT LATIN SMALL LETTER I if (val==0x0000207F) return L; //# L& SUPERSCRIPT LATIN SMALL LETTER N if ((val>=0x2090) && (val<=0x2094)) return L; //# Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA if (val==0x00002102) return L; //# L& DOUBLE-STRUCK CAPITAL C if (val==0x00002107) return L; //# L& EULER CONSTANT if ((val>=0x210A) && (val<=0x2113)) return L; //# L& [10] SCRIPT SMALL G..SCRIPT SMALL L if (val==0x00002115) return L; //# L& DOUBLE-STRUCK CAPITAL N if ((val>=0x2119) && (val<=0x211D)) return L; //# L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R if (val==0x00002124) return L; //# L& DOUBLE-STRUCK CAPITAL Z if (val==0x00002126) return L; //# L& OHM SIGN if (val==0x00002128) return L; //# L& BLACK-LETTER CAPITAL Z if ((val>=0x212A) && (val<=0x212D)) return L; //# L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C if ((val>=0x212F) && (val<=0x2134)) return L; //# L& [6] SCRIPT SMALL E..SCRIPT SMALL O if ((val>=0x2135) && (val<=0x2138)) return L; //# Lo [4] ALEF SYMBOL..DALET SYMBOL if (val==0x00002139) return L; //# L& INFORMATION SOURCE if ((val>=0x213C) && (val<=0x213F)) return L; //# L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI if ((val>=0x2145) && (val<=0x2149)) return L; //# L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J if (val==0x0000214E) return L; //# L& TURNED SMALL F if ((val>=0x2160) && (val<=0x2182)) return L; //# Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND if ((val>=0x2183) && (val<=0x2184)) return L; //# L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C if ((val>=0x2336) && (val<=0x237A)) return L; //# So [69] APL FUNCTIONAL SYMBOL I-BEAM..APL FUNCTIONAL SYMBOL ALPHA if (val==0x00002395) return L; //# So APL FUNCTIONAL SYMBOL QUAD if ((val>=0x249C) && (val<=0x24E9)) return L; //# So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z if (val==0x000026AC) return L; //# So MEDIUM SMALL WHITE CIRCLE if ((val>=0x2800) && (val<=0x28FF)) return L; //# So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 if ((val>=0x2C00) && (val<=0x2C2E)) return L; //# L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE if ((val>=0x2C30) && (val<=0x2C5E)) return L; //# L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE if ((val>=0x2C60) && (val<=0x2C6C)) return L; //# L& [13] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN SMALL LETTER Z WITH DESCENDER if ((val>=0x2C74) && (val<=0x2C77)) return L; //# L& [4] LATIN SMALL LETTER V WITH CURL..LATIN SMALL LETTER TAILLESS PHI if ((val>=0x2C80) && (val<=0x2CE4)) return L; //# L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI if ((val>=0x2D00) && (val<=0x2D25)) return L; //# L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE if ((val>=0x2D30) && (val<=0x2D65)) return L; //# Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ if (val==0x00002D6F) return L; //# Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK if ((val>=0x2D80) && (val<=0x2D96)) return L; //# Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE if ((val>=0x2DA0) && (val<=0x2DA6)) return L; //# Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO if ((val>=0x2DA8) && (val<=0x2DAE)) return L; //# Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO if ((val>=0x2DB0) && (val<=0x2DB6)) return L; //# Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO if ((val>=0x2DB8) && (val<=0x2DBE)) return L; //# Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO if ((val>=0x2DC0) && (val<=0x2DC6)) return L; //# Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO if ((val>=0x2DC8) && (val<=0x2DCE)) return L; //# Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO if ((val>=0x2DD0) && (val<=0x2DD6)) return L; //# Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO if ((val>=0x2DD8) && (val<=0x2DDE)) return L; //# Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO if (val==0x00003005) return L; //# Lm IDEOGRAPHIC ITERATION MARK if (val==0x00003006) return L; //# Lo IDEOGRAPHIC CLOSING MARK if (val==0x00003007) return L; //# Nl IDEOGRAPHIC NUMBER ZERO if ((val>=0x3021) && (val<=0x3029)) return L; //# Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE if ((val>=0x3031) && (val<=0x3035)) return L; //# Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF if ((val>=0x3038) && (val<=0x303A)) return L; //# Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY if (val==0x0000303B) return L; //# Lm VERTICAL IDEOGRAPHIC ITERATION MARK if (val==0x0000303C) return L; //# Lo MASU MARK if ((val>=0x3041) && (val<=0x3096)) return L; //# Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE if ((val>=0x309D) && (val<=0x309E)) return L; //# Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK if (val==0x0000309F) return L; //# Lo HIRAGANA DIGRAPH YORI if ((val>=0x30A1) && (val<=0x30FA)) return L; //# Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO if ((val>=0x30FC) && (val<=0x30FE)) return L; //# Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK if (val==0x000030FF) return L; //# Lo KATAKANA DIGRAPH KOTO if ((val>=0x3105) && (val<=0x312C)) return L; //# Lo [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN if ((val>=0x3131) && (val<=0x318E)) return L; //# Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE if ((val>=0x3190) && (val<=0x3191)) return L; //# So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK if ((val>=0x3192) && (val<=0x3195)) return L; //# No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK if ((val>=0x3196) && (val<=0x319F)) return L; //# So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK if ((val>=0x31A0) && (val<=0x31B7)) return L; //# Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H if ((val>=0x31F0) && (val<=0x31FF)) return L; //# Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO if ((val>=0x3200) && (val<=0x321C)) return L; //# So [29] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED HANGUL CIEUC U if ((val>=0x3220) && (val<=0x3229)) return L; //# No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN if ((val>=0x322A) && (val<=0x3243)) return L; //# So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH if ((val>=0x3260) && (val<=0x327B)) return L; //# So [28] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL HIEUH A if (val==0x0000327F) return L; //# So KOREAN STANDARD SYMBOL if ((val>=0x3280) && (val<=0x3289)) return L; //# No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN if ((val>=0x328A) && (val<=0x32B0)) return L; //# So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT if ((val>=0x32C0) && (val<=0x32CB)) return L; //# So [12] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER if ((val>=0x32D0) && (val<=0x32FE)) return L; //# So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO if ((val>=0x3300) && (val<=0x3376)) return L; //# So [119] SQUARE APAATO..SQUARE PC if ((val>=0x337B) && (val<=0x33DD)) return L; //# So [99] SQUARE ERA NAME HEISEI..SQUARE WB if ((val>=0x33E0) && (val<=0x33FE)) return L; //# So [31] IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE if ((val>=0x3400) && (val<=0x4DB5)) return L; //# Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 if ((val>=0x4E00) && (val<=0x9FBB)) return L; //# Lo [20924] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FBB if ((val>=0xA000) && (val<=0xA014)) return L; //# Lo [21] YI SYLLABLE IT..YI SYLLABLE E if (val==0x0000A015) return L; //# Lm YI SYLLABLE WU if ((val>=0xA016) && (val<=0xA48C)) return L; //# Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR if ((val>=0xA800) && (val<=0xA801)) return L; //# Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I if ((val>=0xA803) && (val<=0xA805)) return L; //# Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O if ((val>=0xA807) && (val<=0xA80A)) return L; //# Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO if ((val>=0xA80C) && (val<=0xA822)) return L; //# Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO if ((val>=0xA823) && (val<=0xA824)) return L; //# Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I if (val==0x0000A827) return L; //# Mc SYLOTI NAGRI VOWEL SIGN OO if ((val>=0xA840) && (val<=0xA873)) return L; //# Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU if ((val>=0xAC00) && (val<=0xD7A3)) return L; //# Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH if ((val>=0xE000) && (val<=0xF8FF)) return L; //# Co [6400] <private-use-E000>..<private-use-F8FF> if ((val>=0xF900) && (val<=0xFA2D)) return L; //# Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D if ((val>=0xFA30) && (val<=0xFA6A)) return L; //# Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A if ((val>=0xFA70) && (val<=0xFAD9)) return L; //# Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 if ((val>=0xFB00) && (val<=0xFB06)) return L; //# L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST if ((val>=0xFB13) && (val<=0xFB17)) return L; //# L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH if ((val>=0xFF21) && (val<=0xFF3A)) return L; //# L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z if ((val>=0xFF41) && (val<=0xFF5A)) return L; //# L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z if ((val>=0xFF66) && (val<=0xFF6F)) return L; //# Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU if (val==0x0000FF70) return L; //# Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK if ((val>=0xFF71) && (val<=0xFF9D)) return L; //# Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N if ((val>=0xFF9E) && (val<=0xFF9F)) return L; //# Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK if ((val>=0xFFA0) && (val<=0xFFBE)) return L; //# Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH if ((val>=0xFFC2) && (val<=0xFFC7)) return L; //# Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E if ((val>=0xFFCA) && (val<=0xFFCF)) return L; //# Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE if ((val>=0xFFD2) && (val<=0xFFD7)) return L; //# Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU if ((val>=0xFFDA) && (val<=0xFFDC)) return L; //# Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I if ((val>=0x10000) && (val<=0x1000B)) return L; //# Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE if ((val>=0x1000D) && (val<=0x10026)) return L; //# Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO if ((val>=0x10028) && (val<=0x1003A)) return L; //# Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO if ((val>=0x1003C) && (val<=0x1003D)) return L; //# Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE if ((val>=0x1003F) && (val<=0x1004D)) return L; //# Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO if ((val>=0x10050) && (val<=0x1005D)) return L; //# Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 if ((val>=0x10080) && (val<=0x100FA)) return L; //# Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 if (val==0x00010100) return L; //# Po AEGEAN WORD SEPARATOR LINE if (val==0x00010102) return L; //# So AEGEAN CHECK MARK if ((val>=0x10107) && (val<=0x10133)) return L; //# No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND if ((val>=0x10137) && (val<=0x1013F)) return L; //# So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT if ((val>=0x10300) && (val<=0x1031E)) return L; //# Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU if ((val>=0x10320) && (val<=0x10323)) return L; //# No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY if ((val>=0x10330) && (val<=0x10340)) return L; //# Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA if (val==0x00010341) return L; //# Nl GOTHIC LETTER NINETY if ((val>=0x10342) && (val<=0x10349)) return L; //# Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL if (val==0x0001034A) return L; //# Nl GOTHIC LETTER NINE HUNDRED if ((val>=0x10380) && (val<=0x1039D)) return L; //# Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU if (val==0x0001039F) return L; //# Po UGARITIC WORD DIVIDER if ((val>=0x103A0) && (val<=0x103C3)) return L; //# Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA if ((val>=0x103C8) && (val<=0x103CF)) return L; //# Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH if (val==0x000103D0) return L; //# Po OLD PERSIAN WORD DIVIDER if ((val>=0x103D1) && (val<=0x103D5)) return L; //# Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED if ((val>=0x10400) && (val<=0x1044F)) return L; //# L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW if ((val>=0x10450) && (val<=0x1049D)) return L; //# Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO if ((val>=0x104A0) && (val<=0x104A9)) return L; //# Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE if ((val>=0x12000) && (val<=0x1236E)) return L; //# Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM if ((val>=0x12400) && (val<=0x12462)) return L; //# Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER if ((val>=0x12470) && (val<=0x12473)) return L; //# Po [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON if ((val>=0x1D000) && (val<=0x1D0F5)) return L; //# So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO if ((val>=0x1D100) && (val<=0x1D126)) return L; //# So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 if ((val>=0x1D12A) && (val<=0x1D164)) return L; //# So [59] MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE if ((val>=0x1D165) && (val<=0x1D166)) return L; //# Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM if ((val>=0x1D16A) && (val<=0x1D16C)) return L; //# So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 if ((val>=0x1D16D) && (val<=0x1D172)) return L; //# Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 if ((val>=0x1D183) && (val<=0x1D184)) return L; //# So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN if ((val>=0x1D18C) && (val<=0x1D1A9)) return L; //# So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH if ((val>=0x1D1AE) && (val<=0x1D1DD)) return L; //# So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS if ((val>=0x1D360) && (val<=0x1D371)) return L; //# No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE if ((val>=0x1D400) && (val<=0x1D454)) return L; //# L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G if ((val>=0x1D456) && (val<=0x1D49C)) return L; //# L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A if ((val>=0x1D49E) && (val<=0x1D49F)) return L; //# L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D if (val==0x0001D4A2) return L; //# L& MATHEMATICAL SCRIPT CAPITAL G if ((val>=0x1D4A5) && (val<=0x1D4A6)) return L; //# L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K if ((val>=0x1D4A9) && (val<=0x1D4AC)) return L; //# L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q if ((val>=0x1D4AE) && (val<=0x1D4B9)) return L; //# L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D if (val==0x0001D4BB) return L; //# L& MATHEMATICAL SCRIPT SMALL F if ((val>=0x1D4BD) && (val<=0x1D4C3)) return L; //# L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N if ((val>=0x1D4C5) && (val<=0x1D505)) return L; //# L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B if ((val>=0x1D507) && (val<=0x1D50A)) return L; //# L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G if ((val>=0x1D50D) && (val<=0x1D514)) return L; //# L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q if ((val>=0x1D516) && (val<=0x1D51C)) return L; //# L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y if ((val>=0x1D51E) && (val<=0x1D539)) return L; //# L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B if ((val>=0x1D53B) && (val<=0x1D53E)) return L; //# L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G if ((val>=0x1D540) && (val<=0x1D544)) return L; //# L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M if (val==0x0001D546) return L; //# L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O if ((val>=0x1D54A) && (val<=0x1D550)) return L; //# L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y if ((val>=0x1D552) && (val<=0x1D6A5)) return L; //# L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J if ((val>=0x1D6A8) && (val<=0x1D6C0)) return L; //# L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA if (val==0x0001D6C1) return L; //# Sm MATHEMATICAL BOLD NABLA if ((val>=0x1D6C2) && (val<=0x1D6DA)) return L; //# L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA if (val==0x0001D6DB) return L; //# Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL if ((val>=0x1D6DC) && (val<=0x1D6FA)) return L; //# L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA if (val==0x0001D6FB) return L; //# Sm MATHEMATICAL ITALIC NABLA if ((val>=0x1D6FC) && (val<=0x1D714)) return L; //# L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA if (val==0x0001D715) return L; //# Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL if ((val>=0x1D716) && (val<=0x1D734)) return L; //# L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA if (val==0x0001D735) return L; //# Sm MATHEMATICAL BOLD ITALIC NABLA if ((val>=0x1D736) && (val<=0x1D74E)) return L; //# L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA if (val==0x0001D74F) return L; //# Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL if ((val>=0x1D750) && (val<=0x1D76E)) return L; //# L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA if (val==0x0001D76F) return L; //# Sm MATHEMATICAL SANS-SERIF BOLD NABLA if ((val>=0x1D770) && (val<=0x1D788)) return L; //# L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA if (val==0x0001D789) return L; //# Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL if ((val>=0x1D78A) && (val<=0x1D7A8)) return L; //# L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA if (val==0x0001D7A9) return L; //# Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA if ((val>=0x1D7AA) && (val<=0x1D7C2)) return L; //# L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA if (val==0x0001D7C3) return L; //# Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL if ((val>=0x1D7C4) && (val<=0x1D7CB)) return L; //# L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA if ((val>=0x20000) && (val<=0x2A6D6)) return L; //# Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 if ((val>=0x2F800) && (val<=0x2FA1D)) return L; //# Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D if ((val>=0xF0000) && (val<=0xFFFFD)) return L; //# Co [65534] <private-use-F0000>..<private-use-FFFFD> if ((val>=0x100000) && (val<=0x10FFFD)) return L; //# Co [65534] <private-use-100000>..<private-use-10FFFD> if (val==0x00000590) return R; //# Cn <reserved-0590> if (val==0x000005BE) return R; //# Po HEBREW PUNCTUATION MAQAF if (val==0x000005C0) return R; //# Po HEBREW PUNCTUATION PASEQ if (val==0x000005C3) return R; //# Po HEBREW PUNCTUATION SOF PASUQ if (val==0x000005C6) return R; //# Po HEBREW PUNCTUATION NUN HAFUKHA if ((val>=0x05C8) && (val<=0x05CF)) return R; //# Cn [8] <reserved-05C8>..<reserved-05CF> if ((val>=0x05D0) && (val<=0x05EA)) return R; //# Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV if ((val>=0x05EB) && (val<=0x05EF)) return R; //# Cn [5] <reserved-05EB>..<reserved-05EF> if ((val>=0x05F0) && (val<=0x05F2)) return R; //# Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD if ((val>=0x05F3) && (val<=0x05F4)) return R; //# Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM if ((val>=0x05F5) && (val<=0x05FF)) return R; //# Cn [11] <reserved-05F5>..<reserved-05FF> if ((val>=0x07C0) && (val<=0x07C9)) return R; //# Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE if ((val>=0x07CA) && (val<=0x07EA)) return R; //# Lo [33] NKO LETTER A..NKO LETTER JONA RA if ((val>=0x07F4) && (val<=0x07F5)) return R; //# Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE if (val==0x000007FA) return R; //# Lm NKO LAJANYALAN if ((val>=0x07FB) && (val<=0x08FF)) return R; //# Cn [261] <reserved-07FB>..<reserved-08FF> if (val==0x0000200F) return R; //# Cf RIGHT-TO-LEFT MARK if (val==0x0000FB1D) return R; //# Lo HEBREW LETTER YOD WITH HIRIQ if ((val>=0xFB1F) && (val<=0xFB28)) return R; //# Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV if ((val>=0xFB2A) && (val<=0xFB36)) return R; //# Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH if (val==0x0000FB37) return R; //# Cn <reserved-FB37> if ((val>=0xFB38) && (val<=0xFB3C)) return R; //# Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH if (val==0x0000FB3D) return R; //# Cn <reserved-FB3D> if (val==0x0000FB3E) return R; //# Lo HEBREW LETTER MEM WITH DAGESH if (val==0x0000FB3F) return R; //# Cn <reserved-FB3F> if ((val>=0xFB40) && (val<=0xFB41)) return R; //# Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH if (val==0x0000FB42) return R; //# Cn <reserved-FB42> if ((val>=0xFB43) && (val<=0xFB44)) return R; //# Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH if (val==0x0000FB45) return R; //# Cn <reserved-FB45> if ((val>=0xFB46) && (val<=0xFB4F)) return R; //# Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED if ((val>=0x10800) && (val<=0x10805)) return R; //# Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA if ((val>=0x10806) && (val<=0x10807)) return R; //# Cn [2] <reserved-10806>..<reserved-10807> if (val==0x00010808) return R; //# Lo CYPRIOT SYLLABLE JO if (val==0x00010809) return R; //# Cn <reserved-10809> if ((val>=0x1080A) && (val<=0x10835)) return R; //# Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO if (val==0x00010836) return R; //# Cn <reserved-10836> if ((val>=0x10837) && (val<=0x10838)) return R; //# Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE if ((val>=0x10839) && (val<=0x1083B)) return R; //# Cn [3] <reserved-10839>..<reserved-1083B> if (val==0x0001083C) return R; //# Lo CYPRIOT SYLLABLE ZA if ((val>=0x1083D) && (val<=0x1083E)) return R; //# Cn [2] <reserved-1083D>..<reserved-1083E> if (val==0x0001083F) return R; //# Lo CYPRIOT SYLLABLE ZO if ((val>=0x10840) && (val<=0x108FF)) return R; //# Cn [192] <reserved-10840>..<reserved-108FF> if ((val>=0x10900) && (val<=0x10915)) return R; //# Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU if ((val>=0x10916) && (val<=0x10919)) return R; //# No [4] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED if ((val>=0x1091A) && (val<=0x1091E)) return R; //# Cn [5] <reserved-1091A>..<reserved-1091E> if ((val>=0x10920) && (val<=0x109FF)) return R; //# Cn [224] <reserved-10920>..<reserved-109FF> if (val==0x00010A00) return R; //# Lo KHAROSHTHI LETTER A if (val==0x00010A04) return R; //# Cn <reserved-10A04> if ((val>=0x10A07) && (val<=0x10A0B)) return R; //# Cn [5] <reserved-10A07>..<reserved-10A0B> if ((val>=0x10A10) && (val<=0x10A13)) return R; //# Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA if (val==0x00010A14) return R; //# Cn <reserved-10A14> if ((val>=0x10A15) && (val<=0x10A17)) return R; //# Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA if (val==0x00010A18) return R; //# Cn <reserved-10A18> if ((val>=0x10A19) && (val<=0x10A33)) return R; //# Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA if ((val>=0x10A34) && (val<=0x10A37)) return R; //# Cn [4] <reserved-10A34>..<reserved-10A37> if ((val>=0x10A3B) && (val<=0x10A3E)) return R; //# Cn [4] <reserved-10A3B>..<reserved-10A3E> if ((val>=0x10A40) && (val<=0x10A47)) return R; //# No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND if ((val>=0x10A48) && (val<=0x10A4F)) return R; //# Cn [8] <reserved-10A48>..<reserved-10A4F> if ((val>=0x10A50) && (val<=0x10A58)) return R; //# Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES if ((val>=0x10A59) && (val<=0x10FFF)) return R; //# Cn [1447] <reserved-10A59>..<reserved-10FFF> if ((val>=0x0030) && (val<=0x0039)) return EN; //# Nd [10] DIGIT ZERO..DIGIT NINE if ((val>=0x00B2) && (val<=0x00B3)) return EN; //# No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE if (val==0x000000B9) return EN; //# No SUPERSCRIPT ONE if ((val>=0x06F0) && (val<=0x06F9)) return EN; //# Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE if (val==0x00002070) return EN; //# No SUPERSCRIPT ZERO if ((val>=0x2074) && (val<=0x2079)) return EN; //# No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE if ((val>=0x2080) && (val<=0x2089)) return EN; //# No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE if ((val>=0x2488) && (val<=0x249B)) return EN; //# No [20] DIGIT ONE FULL STOP..NUMBER TWENTY FULL STOP if ((val>=0xFF10) && (val<=0xFF19)) return EN; //# Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE if ((val>=0x1D7CE) && (val<=0x1D7FF)) return EN; //# Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE if (val==0x0000002B) return ES; //# Sm PLUS SIGN if (val==0x0000002D) return ES; //# Pd HYPHEN-MINUS if ((val>=0x207A) && (val<=0x207B)) return ES; //# Sm [2] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT MINUS if ((val>=0x208A) && (val<=0x208B)) return ES; //# Sm [2] SUBSCRIPT PLUS SIGN..SUBSCRIPT MINUS if (val==0x00002212) return ES; //# Sm MINUS SIGN if (val==0x0000FB29) return ES; //# Sm HEBREW LETTER ALTERNATIVE PLUS SIGN if (val==0x0000FE62) return ES; //# Sm SMALL PLUS SIGN if (val==0x0000FE63) return ES; //# Pd SMALL HYPHEN-MINUS if (val==0x0000FF0B) return ES; //# Sm FULLWIDTH PLUS SIGN if (val==0x0000FF0D) return ES; //# Pd FULLWIDTH HYPHEN-MINUS if (val==0x00000023) return ET; //# Po NUMBER SIGN if (val==0x00000024) return ET; //# Sc DOLLAR SIGN if (val==0x00000025) return ET; //# Po PERCENT SIGN if ((val>=0x00A2) && (val<=0x00A5)) return ET; //# Sc [4] CENT SIGN..YEN SIGN if (val==0x000000B0) return ET; //# So DEGREE SIGN if (val==0x000000B1) return ET; //# Sm PLUS-MINUS SIGN if (val==0x0000066A) return ET; //# Po ARABIC PERCENT SIGN if ((val>=0x09F2) && (val<=0x09F3)) return ET; //# Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN if (val==0x00000AF1) return ET; //# Sc GUJARATI RUPEE SIGN if (val==0x00000BF9) return ET; //# Sc TAMIL RUPEE SIGN if (val==0x00000E3F) return ET; //# Sc THAI CURRENCY SYMBOL BAHT if (val==0x000017DB) return ET; //# Sc KHMER CURRENCY SYMBOL RIEL if ((val>=0x2030) && (val<=0x2034)) return ET; //# Po [5] PER MILLE SIGN..TRIPLE PRIME if ((val>=0x20A0) && (val<=0x20B5)) return ET; //# Sc [22] EURO-CURRENCY SIGN..CEDI SIGN if (val==0x0000212E) return ET; //# So ESTIMATED SYMBOL if (val==0x00002213) return ET; //# Sm MINUS-OR-PLUS SIGN if (val==0x0000FE5F) return ET; //# Po SMALL NUMBER SIGN if (val==0x0000FE69) return ET; //# Sc SMALL DOLLAR SIGN if (val==0x0000FE6A) return ET; //# Po SMALL PERCENT SIGN if (val==0x0000FF03) return ET; //# Po FULLWIDTH NUMBER SIGN if (val==0x0000FF04) return ET; //# Sc FULLWIDTH DOLLAR SIGN if (val==0x0000FF05) return ET; //# Po FULLWIDTH PERCENT SIGN if ((val>=0xFFE0) && (val<=0xFFE1)) return ET; //# Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN if ((val>=0xFFE5) && (val<=0xFFE6)) return ET; //# Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN if ((val>=0x0660) && (val<=0x0669)) return AN; //# Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE if ((val>=0x066B) && (val<=0x066C)) return AN; //# Po [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR if (val==0x0000002C) return CS; //# Po COMMA if ((val>=0x002E) && (val<=0x002F)) return CS; //# Po [2] FULL STOP..SOLIDUS if (val==0x0000003A) return CS; //# Po COLON if (val==0x000000A0) return CS; //# Zs NO-BREAK SPACE if (val==0x0000060C) return CS; //# Po ARABIC COMMA if (val==0x0000202F) return CS; //# Zs NARROW NO-BREAK SPACE if (val==0x00002044) return CS; //# Sm FRACTION SLASH if (val==0x0000FE50) return CS; //# Po SMALL COMMA if (val==0x0000FE52) return CS; //# Po SMALL FULL STOP if (val==0x0000FE55) return CS; //# Po SMALL COLON if (val==0x0000FF0C) return CS; //# Po FULLWIDTH COMMA if ((val>=0xFF0E) && (val<=0xFF0F)) return CS; //# Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS if (val==0x0000FF1A) return CS; //# Po FULLWIDTH COLON if (val==0x0000000A) return B; //# Cc <control-000A> if (val==0x0000000D) return B; //# Cc <control-000D> if ((val>=0x001C) && (val<=0x001E)) return B; //# Cc [3] <control-001C>..<control-001E> if (val==0x00000085) return B; //# Cc <control-0085> if (val==0x00002029) return B; //# Zp PARAGRAPH SEPARATOR if (val==0x00000009) return S; //# Cc <control-0009> if (val==0x0000000B) return S; //# Cc <control-000B> if (val==0x0000001F) return S; //# Cc <control-001F> if (val==0x0000000C) return WS; //# Cc <control-000C> if (val==0x00000020) return WS; //# Zs SPACE if (val==0x00001680) return WS; //# Zs OGHAM SPACE MARK if (val==0x0000180E) return WS; //# Zs MONGOLIAN VOWEL SEPARATOR if ((val>=0x2000) && (val<=0x200A)) return WS; //# Zs [11] EN QUAD..HAIR SPACE if (val==0x00002028) return WS; //# Zl LINE SEPARATOR if (val==0x0000205F) return WS; //# Zs MEDIUM MATHEMATICAL SPACE if (val==0x00003000) return WS; //# Zs IDEOGRAPHIC SPACE if ((val>=0x0021) && (val<=0x0022)) return ON; //# Po [2] EXCLAMATION MARK..QUOTATION MARK if ((val>=0x0026) && (val<=0x0027)) return ON; //# Po [2] AMPERSAND..APOSTROPHE if (val==0x00000028) return ON; //# Ps LEFT PARENTHESIS if (val==0x00000029) return ON; //# Pe RIGHT PARENTHESIS if (val==0x0000002A) return ON; //# Po ASTERISK if (val==0x0000003B) return ON; //# Po SEMICOLON if ((val>=0x003C) && (val<=0x003E)) return ON; //# Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN if ((val>=0x003F) && (val<=0x0040)) return ON; //# Po [2] QUESTION MARK..COMMERCIAL AT if (val==0x0000005B) return ON; //# Ps LEFT SQUARE BRACKET if (val==0x0000005C) return ON; //# Po REVERSE SOLIDUS if (val==0x0000005D) return ON; //# Pe RIGHT SQUARE BRACKET if (val==0x0000005E) return ON; //# Sk CIRCUMFLEX ACCENT if (val==0x0000005F) return ON; //# Pc LOW LINE if (val==0x00000060) return ON; //# Sk GRAVE ACCENT if (val==0x0000007B) return ON; //# Ps LEFT CURLY BRACKET if (val==0x0000007C) return ON; //# Sm VERTICAL LINE if (val==0x0000007D) return ON; //# Pe RIGHT CURLY BRACKET if (val==0x0000007E) return ON; //# Sm TILDE if (val==0x000000A1) return ON; //# Po INVERTED EXCLAMATION MARK if ((val>=0x00A6) && (val<=0x00A7)) return ON; //# So [2] BROKEN BAR..SECTION SIGN if (val==0x000000A8) return ON; //# Sk DIAERESIS if (val==0x000000A9) return ON; //# So COPYRIGHT SIGN if (val==0x000000AB) return ON; //# Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK if (val==0x000000AC) return ON; //# Sm NOT SIGN if (val==0x000000AE) return ON; //# So REGISTERED SIGN if (val==0x000000AF) return ON; //# Sk MACRON if (val==0x000000B4) return ON; //# Sk ACUTE ACCENT if (val==0x000000B6) return ON; //# So PILCROW SIGN if (val==0x000000B7) return ON; //# Po MIDDLE DOT if (val==0x000000B8) return ON; //# Sk CEDILLA if (val==0x000000BB) return ON; //# Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK if ((val>=0x00BC) && (val<=0x00BE)) return ON; //# No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS if (val==0x000000BF) return ON; //# Po INVERTED QUESTION MARK if (val==0x000000D7) return ON; //# Sm MULTIPLICATION SIGN if (val==0x000000F7) return ON; //# Sm DIVISION SIGN if ((val>=0x02B9) && (val<=0x02BA)) return ON; //# Lm [2] MODIFIER LETTER PRIME..MODIFIER LETTER DOUBLE PRIME if ((val>=0x02C2) && (val<=0x02C5)) return ON; //# Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD if ((val>=0x02C6) && (val<=0x02CF)) return ON; //# Lm [10] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER LOW ACUTE ACCENT if ((val>=0x02D2) && (val<=0x02DF)) return ON; //# Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT if ((val>=0x02E5) && (val<=0x02ED)) return ON; //# Sk [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED if ((val>=0x02EF) && (val<=0x02FF)) return ON; //# Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW if ((val>=0x0374) && (val<=0x0375)) return ON; //# Sk [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN if (val==0x0000037E) return ON; //# Po GREEK QUESTION MARK if ((val>=0x0384) && (val<=0x0385)) return ON; //# Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS if (val==0x00000387) return ON; //# Po GREEK ANO TELEIA if (val==0x000003F6) return ON; //# Sm GREEK REVERSED LUNATE EPSILON SYMBOL if (val==0x0000058A) return ON; //# Pd ARMENIAN HYPHEN if ((val>=0x060E) && (val<=0x060F)) return ON; //# So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA if (val==0x000006E9) return ON; //# So ARABIC PLACE OF SAJDAH if (val==0x000007F6) return ON; //# So NKO SYMBOL OO DENNEN if ((val>=0x07F7) && (val<=0x07F9)) return ON; //# Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK if ((val>=0x0BF3) && (val<=0x0BF8)) return ON; //# So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN if (val==0x00000BFA) return ON; //# So TAMIL NUMBER SIGN if ((val>=0x0CF1) && (val<=0x0CF2)) return ON; //# So [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA if (val==0x00000F3A) return ON; //# Ps TIBETAN MARK GUG RTAGS GYON if (val==0x00000F3B) return ON; //# Pe TIBETAN MARK GUG RTAGS GYAS if (val==0x00000F3C) return ON; //# Ps TIBETAN MARK ANG KHANG GYON if (val==0x00000F3D) return ON; //# Pe TIBETAN MARK ANG KHANG GYAS if ((val>=0x1390) && (val<=0x1399)) return ON; //# So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT if (val==0x0000169B) return ON; //# Ps OGHAM FEATHER MARK if (val==0x0000169C) return ON; //# Pe OGHAM REVERSED FEATHER MARK if ((val>=0x17F0) && (val<=0x17F9)) return ON; //# No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON if ((val>=0x1800) && (val<=0x1805)) return ON; //# Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS if (val==0x00001806) return ON; //# Pd MONGOLIAN TODO SOFT HYPHEN if ((val>=0x1807) && (val<=0x180A)) return ON; //# Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU if (val==0x00001940) return ON; //# So LIMBU SIGN LOO if ((val>=0x1944) && (val<=0x1945)) return ON; //# Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK if ((val>=0x19DE) && (val<=0x19DF)) return ON; //# Po [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV if ((val>=0x19E0) && (val<=0x19FF)) return ON; //# So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC if (val==0x00001FBD) return ON; //# Sk GREEK KORONIS if ((val>=0x1FBF) && (val<=0x1FC1)) return ON; //# Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI if ((val>=0x1FCD) && (val<=0x1FCF)) return ON; //# Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI if ((val>=0x1FDD) && (val<=0x1FDF)) return ON; //# Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI if ((val>=0x1FED) && (val<=0x1FEF)) return ON; //# Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA if ((val>=0x1FFD) && (val<=0x1FFE)) return ON; //# Sk [2] GREEK OXIA..GREEK DASIA if ((val>=0x2010) && (val<=0x2015)) return ON; //# Pd [6] HYPHEN..HORIZONTAL BAR if ((val>=0x2016) && (val<=0x2017)) return ON; //# Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE if (val==0x00002018) return ON; //# Pi LEFT SINGLE QUOTATION MARK if (val==0x00002019) return ON; //# Pf RIGHT SINGLE QUOTATION MARK if (val==0x0000201A) return ON; //# Ps SINGLE LOW-9 QUOTATION MARK if ((val>=0x201B) && (val<=0x201C)) return ON; //# Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK if (val==0x0000201D) return ON; //# Pf RIGHT DOUBLE QUOTATION MARK if (val==0x0000201E) return ON; //# Ps DOUBLE LOW-9 QUOTATION MARK if (val==0x0000201F) return ON; //# Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK if ((val>=0x2020) && (val<=0x2027)) return ON; //# Po [8] DAGGER..HYPHENATION POINT if ((val>=0x2035) && (val<=0x2038)) return ON; //# Po [4] REVERSED PRIME..CARET if (val==0x00002039) return ON; //# Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK if (val==0x0000203A) return ON; //# Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK if ((val>=0x203B) && (val<=0x203E)) return ON; //# Po [4] REFERENCE MARK..OVERLINE if ((val>=0x203F) && (val<=0x2040)) return ON; //# Pc [2] UNDERTIE..CHARACTER TIE if ((val>=0x2041) && (val<=0x2043)) return ON; //# Po [3] CARET INSERTION POINT..HYPHEN BULLET if (val==0x00002045) return ON; //# Ps LEFT SQUARE BRACKET WITH QUILL if (val==0x00002046) return ON; //# Pe RIGHT SQUARE BRACKET WITH QUILL if ((val>=0x2047) && (val<=0x2051)) return ON; //# Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY if (val==0x00002052) return ON; //# Sm COMMERCIAL MINUS SIGN if (val==0x00002053) return ON; //# Po SWUNG DASH if (val==0x00002054) return ON; //# Pc INVERTED UNDERTIE if ((val>=0x2055) && (val<=0x205E)) return ON; //# Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS if (val==0x0000207C) return ON; //# Sm SUPERSCRIPT EQUALS SIGN if (val==0x0000207D) return ON; //# Ps SUPERSCRIPT LEFT PARENTHESIS if (val==0x0000207E) return ON; //# Pe SUPERSCRIPT RIGHT PARENTHESIS if (val==0x0000208C) return ON; //# Sm SUBSCRIPT EQUALS SIGN if (val==0x0000208D) return ON; //# Ps SUBSCRIPT LEFT PARENTHESIS if (val==0x0000208E) return ON; //# Pe SUBSCRIPT RIGHT PARENTHESIS if ((val>=0x2100) && (val<=0x2101)) return ON; //# So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT if ((val>=0x2103) && (val<=0x2106)) return ON; //# So [4] DEGREE CELSIUS..CADA UNA if ((val>=0x2108) && (val<=0x2109)) return ON; //# So [2] SCRUPLE..DEGREE FAHRENHEIT if (val==0x00002114) return ON; //# So L B BAR SYMBOL if ((val>=0x2116) && (val<=0x2118)) return ON; //# So [3] NUMERO SIGN..SCRIPT CAPITAL P if ((val>=0x211E) && (val<=0x2123)) return ON; //# So [6] PRESCRIPTION TAKE..VERSICLE if (val==0x00002125) return ON; //# So OUNCE SIGN if (val==0x00002127) return ON; //# So INVERTED OHM SIGN if (val==0x00002129) return ON; //# So TURNED GREEK SMALL LETTER IOTA if ((val>=0x213A) && (val<=0x213B)) return ON; //# So [2] ROTATED CAPITAL Q..FACSIMILE SIGN if ((val>=0x2140) && (val<=0x2144)) return ON; //# Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y if (val==0x0000214A) return ON; //# So PROPERTY LINE if (val==0x0000214B) return ON; //# Sm TURNED AMPERSAND if ((val>=0x214C) && (val<=0x214D)) return ON; //# So [2] PER SIGN..AKTIESELSKAB if ((val>=0x2153) && (val<=0x215F)) return ON; //# No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE if ((val>=0x2190) && (val<=0x2194)) return ON; //# Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW if ((val>=0x2195) && (val<=0x2199)) return ON; //# So [5] UP DOWN ARROW..SOUTH WEST ARROW if ((val>=0x219A) && (val<=0x219B)) return ON; //# Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE if ((val>=0x219C) && (val<=0x219F)) return ON; //# So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW if (val==0x000021A0) return ON; //# Sm RIGHTWARDS TWO HEADED ARROW if ((val>=0x21A1) && (val<=0x21A2)) return ON; //# So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL if (val==0x000021A3) return ON; //# Sm RIGHTWARDS ARROW WITH TAIL if ((val>=0x21A4) && (val<=0x21A5)) return ON; //# So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR if (val==0x000021A6) return ON; //# Sm RIGHTWARDS ARROW FROM BAR if ((val>=0x21A7) && (val<=0x21AD)) return ON; //# So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW if (val==0x000021AE) return ON; //# Sm LEFT RIGHT ARROW WITH STROKE if ((val>=0x21AF) && (val<=0x21CD)) return ON; //# So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE if ((val>=0x21CE) && (val<=0x21CF)) return ON; //# Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE if ((val>=0x21D0) && (val<=0x21D1)) return ON; //# So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW if (val==0x000021D2) return ON; //# Sm RIGHTWARDS DOUBLE ARROW if (val==0x000021D3) return ON; //# So DOWNWARDS DOUBLE ARROW if (val==0x000021D4) return ON; //# Sm LEFT RIGHT DOUBLE ARROW if ((val>=0x21D5) && (val<=0x21F3)) return ON; //# So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW if ((val>=0x21F4) && (val<=0x2211)) return ON; //# Sm [30] RIGHT ARROW WITH SMALL CIRCLE..N-ARY SUMMATION if ((val>=0x2214) && (val<=0x22FF)) return ON; //# Sm [236] DOT PLUS..Z NOTATION BAG MEMBERSHIP if ((val>=0x2300) && (val<=0x2307)) return ON; //# So [8] DIAMETER SIGN..WAVY LINE if ((val>=0x2308) && (val<=0x230B)) return ON; //# Sm [4] LEFT CEILING..RIGHT FLOOR if ((val>=0x230C) && (val<=0x231F)) return ON; //# So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER if ((val>=0x2320) && (val<=0x2321)) return ON; //# Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL if ((val>=0x2322) && (val<=0x2328)) return ON; //# So [7] FROWN..KEYBOARD if (val==0x00002329) return ON; //# Ps LEFT-POINTING ANGLE BRACKET if (val==0x0000232A) return ON; //# Pe RIGHT-POINTING ANGLE BRACKET if ((val>=0x232B) && (val<=0x2335)) return ON; //# So [11] ERASE TO THE LEFT..COUNTERSINK if (val==0x0000237B) return ON; //# So NOT CHECK MARK if (val==0x0000237C) return ON; //# Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW if ((val>=0x237D) && (val<=0x2394)) return ON; //# So [24] SHOULDERED OPEN BOX..SOFTWARE-FUNCTION SYMBOL if ((val>=0x2396) && (val<=0x239A)) return ON; //# So [5] DECIMAL SEPARATOR KEY SYMBOL..CLEAR SCREEN SYMBOL if ((val>=0x239B) && (val<=0x23B3)) return ON; //# Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM if ((val>=0x23B4) && (val<=0x23DB)) return ON; //# So [40] TOP SQUARE BRACKET..FUSE if ((val>=0x23DC) && (val<=0x23E1)) return ON; //# Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET if ((val>=0x23E2) && (val<=0x23E7)) return ON; //# So [6] WHITE TRAPEZIUM..ELECTRICAL INTERSECTION if ((val>=0x2400) && (val<=0x2426)) return ON; //# So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO if ((val>=0x2440) && (val<=0x244A)) return ON; //# So [11] OCR HOOK..OCR DOUBLE BACKSLASH if ((val>=0x2460) && (val<=0x2487)) return ON; //# No [40] CIRCLED DIGIT ONE..PARENTHESIZED NUMBER TWENTY if ((val>=0x24EA) && (val<=0x24FF)) return ON; //# No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO if ((val>=0x2500) && (val<=0x25B6)) return ON; //# So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE if (val==0x000025B7) return ON; //# Sm WHITE RIGHT-POINTING TRIANGLE if ((val>=0x25B8) && (val<=0x25C0)) return ON; //# So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE if (val==0x000025C1) return ON; //# Sm WHITE LEFT-POINTING TRIANGLE if ((val>=0x25C2) && (val<=0x25F7)) return ON; //# So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT if ((val>=0x25F8) && (val<=0x25FF)) return ON; //# Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE if ((val>=0x2600) && (val<=0x266E)) return ON; //# So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN if (val==0x0000266F) return ON; //# Sm MUSIC SHARP SIGN if ((val>=0x2670) && (val<=0x269C)) return ON; //# So [45] WEST SYRIAC CROSS..FLEUR-DE-LIS if ((val>=0x26A0) && (val<=0x26AB)) return ON; //# So [12] WARNING SIGN..MEDIUM BLACK CIRCLE if ((val>=0x26AD) && (val<=0x26B2)) return ON; //# So [6] MARRIAGE SYMBOL..NEUTER if ((val>=0x2701) && (val<=0x2704)) return ON; //# So [4] UPPER BLADE SCISSORS..WHITE SCISSORS if ((val>=0x2706) && (val<=0x2709)) return ON; //# So [4] TELEPHONE LOCATION SIGN..ENVELOPE if ((val>=0x270C) && (val<=0x2727)) return ON; //# So [28] VICTORY HAND..WHITE FOUR POINTED STAR if ((val>=0x2729) && (val<=0x274B)) return ON; //# So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK if (val==0x0000274D) return ON; //# So SHADOWED WHITE CIRCLE if ((val>=0x274F) && (val<=0x2752)) return ON; //# So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE if (val==0x00002756) return ON; //# So BLACK DIAMOND MINUS WHITE X if ((val>=0x2758) && (val<=0x275E)) return ON; //# So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT if ((val>=0x2761) && (val<=0x2767)) return ON; //# So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET if (val==0x00002768) return ON; //# Ps MEDIUM LEFT PARENTHESIS ORNAMENT if (val==0x00002769) return ON; //# Pe MEDIUM RIGHT PARENTHESIS ORNAMENT if (val==0x0000276A) return ON; //# Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT if (val==0x0000276B) return ON; //# Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT if (val==0x0000276C) return ON; //# Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT if (val==0x0000276D) return ON; //# Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT if (val==0x0000276E) return ON; //# Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT if (val==0x0000276F) return ON; //# Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT if (val==0x00002770) return ON; //# Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT if (val==0x00002771) return ON; //# Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT if (val==0x00002772) return ON; //# Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT if (val==0x00002773) return ON; //# Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT if (val==0x00002774) return ON; //# Ps MEDIUM LEFT CURLY BRACKET ORNAMENT if (val==0x00002775) return ON; //# Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT if ((val>=0x2776) && (val<=0x2793)) return ON; //# No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN if (val==0x00002794) return ON; //# So HEAVY WIDE-HEADED RIGHTWARDS ARROW if ((val>=0x2798) && (val<=0x27AF)) return ON; //# So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW if ((val>=0x27B1) && (val<=0x27BE)) return ON; //# So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW if ((val>=0x27C0) && (val<=0x27C4)) return ON; //# Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET if (val==0x000027C5) return ON; //# Ps LEFT S-SHAPED BAG DELIMITER if (val==0x000027C6) return ON; //# Pe RIGHT S-SHAPED BAG DELIMITER if ((val>=0x27C7) && (val<=0x27CA)) return ON; //# Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE if ((val>=0x27D0) && (val<=0x27E5)) return ON; //# Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK if (val==0x000027E6) return ON; //# Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET if (val==0x000027E7) return ON; //# Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET if (val==0x000027E8) return ON; //# Ps MATHEMATICAL LEFT ANGLE BRACKET if (val==0x000027E9) return ON; //# Pe MATHEMATICAL RIGHT ANGLE BRACKET if (val==0x000027EA) return ON; //# Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET if (val==0x000027EB) return ON; //# Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET if ((val>=0x27F0) && (val<=0x27FF)) return ON; //# Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW if ((val>=0x2900) && (val<=0x2982)) return ON; //# Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON if (val==0x00002983) return ON; //# Ps LEFT WHITE CURLY BRACKET if (val==0x00002984) return ON; //# Pe RIGHT WHITE CURLY BRACKET if (val==0x00002985) return ON; //# Ps LEFT WHITE PARENTHESIS if (val==0x00002986) return ON; //# Pe RIGHT WHITE PARENTHESIS if (val==0x00002987) return ON; //# Ps Z NOTATION LEFT IMAGE BRACKET if (val==0x00002988) return ON; //# Pe Z NOTATION RIGHT IMAGE BRACKET if (val==0x00002989) return ON; //# Ps Z NOTATION LEFT BINDING BRACKET if (val==0x0000298A) return ON; //# Pe Z NOTATION RIGHT BINDING BRACKET if (val==0x0000298B) return ON; //# Ps LEFT SQUARE BRACKET WITH UNDERBAR if (val==0x0000298C) return ON; //# Pe RIGHT SQUARE BRACKET WITH UNDERBAR if (val==0x0000298D) return ON; //# Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER if (val==0x0000298E) return ON; //# Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER if (val==0x0000298F) return ON; //# Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER if (val==0x00002990) return ON; //# Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER if (val==0x00002991) return ON; //# Ps LEFT ANGLE BRACKET WITH DOT if (val==0x00002992) return ON; //# Pe RIGHT ANGLE BRACKET WITH DOT if (val==0x00002993) return ON; //# Ps LEFT ARC LESS-THAN BRACKET if (val==0x00002994) return ON; //# Pe RIGHT ARC GREATER-THAN BRACKET if (val==0x00002995) return ON; //# Ps DOUBLE LEFT ARC GREATER-THAN BRACKET if (val==0x00002996) return ON; //# Pe DOUBLE RIGHT ARC LESS-THAN BRACKET if (val==0x00002997) return ON; //# Ps LEFT BLACK TORTOISE SHELL BRACKET if (val==0x00002998) return ON; //# Pe RIGHT BLACK TORTOISE SHELL BRACKET if ((val>=0x2999) && (val<=0x29D7)) return ON; //# Sm [63] DOTTED FENCE..BLACK HOURGLASS if (val==0x000029D8) return ON; //# Ps LEFT WIGGLY FENCE if (val==0x000029D9) return ON; //# Pe RIGHT WIGGLY FENCE if (val==0x000029DA) return ON; //# Ps LEFT DOUBLE WIGGLY FENCE if (val==0x000029DB) return ON; //# Pe RIGHT DOUBLE WIGGLY FENCE if ((val>=0x29DC) && (val<=0x29FB)) return ON; //# Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS if (val==0x000029FC) return ON; //# Ps LEFT-POINTING CURVED ANGLE BRACKET if (val==0x000029FD) return ON; //# Pe RIGHT-POINTING CURVED ANGLE BRACKET if ((val>=0x29FE) && (val<=0x2AFF)) return ON; //# Sm [258] TINY..N-ARY WHITE VERTICAL BAR if ((val>=0x2B00) && (val<=0x2B1A)) return ON; //# So [27] NORTH EAST WHITE ARROW..DOTTED SQUARE if ((val>=0x2B20) && (val<=0x2B23)) return ON; //# So [4] WHITE PENTAGON..HORIZONTAL BLACK HEXAGON if ((val>=0x2CE5) && (val<=0x2CEA)) return ON; //# So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA if ((val>=0x2CF9) && (val<=0x2CFC)) return ON; //# Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER if (val==0x00002CFD) return ON; //# No COPTIC FRACTION ONE HALF if ((val>=0x2CFE) && (val<=0x2CFF)) return ON; //# Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER if ((val>=0x2E00) && (val<=0x2E01)) return ON; //# Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER if (val==0x00002E02) return ON; //# Pi LEFT SUBSTITUTION BRACKET if (val==0x00002E03) return ON; //# Pf RIGHT SUBSTITUTION BRACKET if (val==0x00002E04) return ON; //# Pi LEFT DOTTED SUBSTITUTION BRACKET if (val==0x00002E05) return ON; //# Pf RIGHT DOTTED SUBSTITUTION BRACKET if ((val>=0x2E06) && (val<=0x2E08)) return ON; //# Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER if (val==0x00002E09) return ON; //# Pi LEFT TRANSPOSITION BRACKET if (val==0x00002E0A) return ON; //# Pf RIGHT TRANSPOSITION BRACKET if (val==0x00002E0B) return ON; //# Po RAISED SQUARE if (val==0x00002E0C) return ON; //# Pi LEFT RAISED OMISSION BRACKET if (val==0x00002E0D) return ON; //# Pf RIGHT RAISED OMISSION BRACKET if ((val>=0x2E0E) && (val<=0x2E16)) return ON; //# Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE if (val==0x00002E17) return ON; //# Pd DOUBLE OBLIQUE HYPHEN if (val==0x00002E1C) return ON; //# Pi LEFT LOW PARAPHRASE BRACKET if (val==0x00002E1D) return ON; //# Pf RIGHT LOW PARAPHRASE BRACKET if ((val>=0x2E80) && (val<=0x2E99)) return ON; //# So [26] CJK RADICAL REPEAT..CJK RADICAL RAP if ((val>=0x2E9B) && (val<=0x2EF3)) return ON; //# So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE if ((val>=0x2F00) && (val<=0x2FD5)) return ON; //# So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE if ((val>=0x2FF0) && (val<=0x2FFB)) return ON; //# So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID if ((val>=0x3001) && (val<=0x3003)) return ON; //# Po [3] IDEOGRAPHIC COMMA..DITTO MARK if (val==0x00003004) return ON; //# So JAPANESE INDUSTRIAL STANDARD SYMBOL if (val==0x00003008) return ON; //# Ps LEFT ANGLE BRACKET if (val==0x00003009) return ON; //# Pe RIGHT ANGLE BRACKET if (val==0x0000300A) return ON; //# Ps LEFT DOUBLE ANGLE BRACKET if (val==0x0000300B) return ON; //# Pe RIGHT DOUBLE ANGLE BRACKET if (val==0x0000300C) return ON; //# Ps LEFT CORNER BRACKET if (val==0x0000300D) return ON; //# Pe RIGHT CORNER BRACKET if (val==0x0000300E) return ON; //# Ps LEFT WHITE CORNER BRACKET if (val==0x0000300F) return ON; //# Pe RIGHT WHITE CORNER BRACKET if (val==0x00003010) return ON; //# Ps LEFT BLACK LENTICULAR BRACKET if (val==0x00003011) return ON; //# Pe RIGHT BLACK LENTICULAR BRACKET if ((val>=0x3012) && (val<=0x3013)) return ON; //# So [2] POSTAL MARK..GETA MARK if (val==0x00003014) return ON; //# Ps LEFT TORTOISE SHELL BRACKET if (val==0x00003015) return ON; //# Pe RIGHT TORTOISE SHELL BRACKET if (val==0x00003016) return ON; //# Ps LEFT WHITE LENTICULAR BRACKET if (val==0x00003017) return ON; //# Pe RIGHT WHITE LENTICULAR BRACKET if (val==0x00003018) return ON; //# Ps LEFT WHITE TORTOISE SHELL BRACKET if (val==0x00003019) return ON; //# Pe RIGHT WHITE TORTOISE SHELL BRACKET if (val==0x0000301A) return ON; //# Ps LEFT WHITE SQUARE BRACKET if (val==0x0000301B) return ON; //# Pe RIGHT WHITE SQUARE BRACKET if (val==0x0000301C) return ON; //# Pd WAVE DASH if (val==0x0000301D) return ON; //# Ps REVERSED DOUBLE PRIME QUOTATION MARK if ((val>=0x301E) && (val<=0x301F)) return ON; //# Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK if (val==0x00003020) return ON; //# So POSTAL MARK FACE if (val==0x00003030) return ON; //# Pd WAVY DASH if ((val>=0x3036) && (val<=0x3037)) return ON; //# So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL if (val==0x0000303D) return ON; //# Po PART ALTERNATION MARK if ((val>=0x303E) && (val<=0x303F)) return ON; //# So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE if ((val>=0x309B) && (val<=0x309C)) return ON; //# Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK if (val==0x000030A0) return ON; //# Pd KATAKANA-HIRAGANA DOUBLE HYPHEN if (val==0x000030FB) return ON; //# Po KATAKANA MIDDLE DOT if ((val>=0x31C0) && (val<=0x31CF)) return ON; //# So [16] CJK STROKE T..CJK STROKE N if ((val>=0x321D) && (val<=0x321E)) return ON; //# So [2] PARENTHESIZED KOREAN CHARACTER OJEON..PARENTHESIZED KOREAN CHARACTER O HU if (val==0x00003250) return ON; //# So PARTNERSHIP SIGN if ((val>=0x3251) && (val<=0x325F)) return ON; //# No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE if ((val>=0x327C) && (val<=0x327E)) return ON; //# So [3] CIRCLED KOREAN CHARACTER CHAMKO..CIRCLED HANGUL IEUNG U if ((val>=0x32B1) && (val<=0x32BF)) return ON; //# No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY if ((val>=0x32CC) && (val<=0x32CF)) return ON; //# So [4] SQUARE HG..LIMITED LIABILITY SIGN if ((val>=0x3377) && (val<=0x337A)) return ON; //# So [4] SQUARE DM..SQUARE IU if ((val>=0x33DE) && (val<=0x33DF)) return ON; //# So [2] SQUARE V OVER M..SQUARE A OVER M if (val==0x000033FF) return ON; //# So SQUARE GAL if ((val>=0x4DC0) && (val<=0x4DFF)) return ON; //# So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION if ((val>=0xA490) && (val<=0xA4C6)) return ON; //# So [55] YI RADICAL QOT..YI RADICAL KE if ((val>=0xA700) && (val<=0xA716)) return ON; //# Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR if ((val>=0xA717) && (val<=0xA71A)) return ON; //# Lm [4] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOWER RIGHT CORNER ANGLE if ((val>=0xA720) && (val<=0xA721)) return ON; //# Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE if ((val>=0xA828) && (val<=0xA82B)) return ON; //# So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 if ((val>=0xA874) && (val<=0xA877)) return ON; //# Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD if (val==0x0000FD3E) return ON; //# Ps ORNATE LEFT PARENTHESIS if (val==0x0000FD3F) return ON; //# Pe ORNATE RIGHT PARENTHESIS if (val==0x0000FDFD) return ON; //# So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM if ((val>=0xFE10) && (val<=0xFE16)) return ON; //# Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK if (val==0x0000FE17) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET if (val==0x0000FE18) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET if (val==0x0000FE19) return ON; //# Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS if (val==0x0000FE30) return ON; //# Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER if ((val>=0xFE31) && (val<=0xFE32)) return ON; //# Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH if ((val>=0xFE33) && (val<=0xFE34)) return ON; //# Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE if (val==0x0000FE35) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS if (val==0x0000FE36) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS if (val==0x0000FE37) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET if (val==0x0000FE38) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET if (val==0x0000FE39) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET if (val==0x0000FE3A) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET if (val==0x0000FE3B) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET if (val==0x0000FE3C) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET if (val==0x0000FE3D) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET if (val==0x0000FE3E) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET if (val==0x0000FE3F) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET if (val==0x0000FE40) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET if (val==0x0000FE41) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET if (val==0x0000FE42) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET if (val==0x0000FE43) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET if (val==0x0000FE44) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET if ((val>=0xFE45) && (val<=0xFE46)) return ON; //# Po [2] SESAME DOT..WHITE SESAME DOT if (val==0x0000FE47) return ON; //# Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET if (val==0x0000FE48) return ON; //# Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET if ((val>=0xFE49) && (val<=0xFE4C)) return ON; //# Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE if ((val>=0xFE4D) && (val<=0xFE4F)) return ON; //# Pc [3] DASHED LOW LINE..WAVY LOW LINE if (val==0x0000FE51) return ON; //# Po SMALL IDEOGRAPHIC COMMA if (val==0x0000FE54) return ON; //# Po SMALL SEMICOLON if ((val>=0xFE56) && (val<=0xFE57)) return ON; //# Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK if (val==0x0000FE58) return ON; //# Pd SMALL EM DASH if (val==0x0000FE59) return ON; //# Ps SMALL LEFT PARENTHESIS if (val==0x0000FE5A) return ON; //# Pe SMALL RIGHT PARENTHESIS if (val==0x0000FE5B) return ON; //# Ps SMALL LEFT CURLY BRACKET if (val==0x0000FE5C) return ON; //# Pe SMALL RIGHT CURLY BRACKET if (val==0x0000FE5D) return ON; //# Ps SMALL LEFT TORTOISE SHELL BRACKET if (val==0x0000FE5E) return ON; //# Pe SMALL RIGHT TORTOISE SHELL BRACKET if ((val>=0xFE60) && (val<=0xFE61)) return ON; //# Po [2] SMALL AMPERSAND..SMALL ASTERISK if ((val>=0xFE64) && (val<=0xFE66)) return ON; //# Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN if (val==0x0000FE68) return ON; //# Po SMALL REVERSE SOLIDUS if (val==0x0000FE6B) return ON; //# Po SMALL COMMERCIAL AT if ((val>=0xFF01) && (val<=0xFF02)) return ON; //# Po [2] FULLWIDTH EXCLAMATION MARK..FULLWIDTH QUOTATION MARK if ((val>=0xFF06) && (val<=0xFF07)) return ON; //# Po [2] FULLWIDTH AMPERSAND..FULLWIDTH APOSTROPHE if (val==0x0000FF08) return ON; //# Ps FULLWIDTH LEFT PARENTHESIS if (val==0x0000FF09) return ON; //# Pe FULLWIDTH RIGHT PARENTHESIS if (val==0x0000FF0A) return ON; //# Po FULLWIDTH ASTERISK if (val==0x0000FF1B) return ON; //# Po FULLWIDTH SEMICOLON if ((val>=0xFF1C) && (val<=0xFF1E)) return ON; //# Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN if ((val>=0xFF1F) && (val<=0xFF20)) return ON; //# Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT if (val==0x0000FF3B) return ON; //# Ps FULLWIDTH LEFT SQUARE BRACKET if (val==0x0000FF3C) return ON; //# Po FULLWIDTH REVERSE SOLIDUS if (val==0x0000FF3D) return ON; //# Pe FULLWIDTH RIGHT SQUARE BRACKET if (val==0x0000FF3E) return ON; //# Sk FULLWIDTH CIRCUMFLEX ACCENT if (val==0x0000FF3F) return ON; //# Pc FULLWIDTH LOW LINE if (val==0x0000FF40) return ON; //# Sk FULLWIDTH GRAVE ACCENT if (val==0x0000FF5B) return ON; //# Ps FULLWIDTH LEFT CURLY BRACKET if (val==0x0000FF5C) return ON; //# Sm FULLWIDTH VERTICAL LINE if (val==0x0000FF5D) return ON; //# Pe FULLWIDTH RIGHT CURLY BRACKET if (val==0x0000FF5E) return ON; //# Sm FULLWIDTH TILDE if (val==0x0000FF5F) return ON; //# Ps FULLWIDTH LEFT WHITE PARENTHESIS if (val==0x0000FF60) return ON; //# Pe FULLWIDTH RIGHT WHITE PARENTHESIS if (val==0x0000FF61) return ON; //# Po HALFWIDTH IDEOGRAPHIC FULL STOP if (val==0x0000FF62) return ON; //# Ps HALFWIDTH LEFT CORNER BRACKET if (val==0x0000FF63) return ON; //# Pe HALFWIDTH RIGHT CORNER BRACKET if ((val>=0xFF64) && (val<=0xFF65)) return ON; //# Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT if (val==0x0000FFE2) return ON; //# Sm FULLWIDTH NOT SIGN if (val==0x0000FFE3) return ON; //# Sk FULLWIDTH MACRON if (val==0x0000FFE4) return ON; //# So FULLWIDTH BROKEN BAR if (val==0x0000FFE8) return ON; //# So HALFWIDTH FORMS LIGHT VERTICAL if ((val>=0xFFE9) && (val<=0xFFEC)) return ON; //# Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW if ((val>=0xFFED) && (val<=0xFFEE)) return ON; //# So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE if ((val>=0xFFF9) && (val<=0xFFFB)) return ON; //# Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR if ((val>=0xFFFC) && (val<=0xFFFD)) return ON; //# So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER if (val==0x00010101) return ON; //# Po AEGEAN WORD SEPARATOR DOT if ((val>=0x10140) && (val<=0x10174)) return ON; //# Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS if ((val>=0x10175) && (val<=0x10178)) return ON; //# No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN if ((val>=0x10179) && (val<=0x10189)) return ON; //# So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN if (val==0x0001018A) return ON; //# No GREEK ZERO SIGN if (val==0x0001091F) return ON; //# Po PHOENICIAN WORD SEPARATOR if ((val>=0x1D200) && (val<=0x1D241)) return ON; //# So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 if (val==0x0001D245) return ON; //# So GREEK MUSICAL LEIMMA if ((val>=0x1D300) && (val<=0x1D356)) return ON; //# So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING if (/*(val>=0x0000) && */(val<=0x0008)) return BN; //# Cc [9] <control-0000>..<control-0008> if ((val>=0x000E) && (val<=0x001B)) return BN; //# Cc [14] <control-000E>..<control-001B> if ((val>=0x007F) && (val<=0x0084)) return BN; //# Cc [6] <control-007F>..<control-0084> if ((val>=0x0086) && (val<=0x009F)) return BN; //# Cc [26] <control-0086>..<control-009F> if (val==0x000000AD) return BN; //# Cf SOFT HYPHEN if (val==0x0000070F) return BN; //# Cf SYRIAC ABBREVIATION MARK if ((val>=0x200B) && (val<=0x200D)) return BN; //# Cf [3] ZERO WIDTH SPACE..ZERO WIDTH JOINER if ((val>=0x2060) && (val<=0x2063)) return BN; //# Cf [4] WORD JOINER..INVISIBLE SEPARATOR if ((val>=0x2064) && (val<=0x2069)) return BN; //# Cn [6] <reserved-2064>..<reserved-2069> if ((val>=0x206A) && (val<=0x206F)) return BN; //# Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES if ((val>=0xFDD0) && (val<=0xFDEF)) return BN; //# Cn [32] <noncharacter-FDD0>..<noncharacter-FDEF> if (val==0x0000FEFF) return BN; //# Cf ZERO WIDTH NO-BREAK SPACE if ((val>=0xFFF0) && (val<=0xFFF8)) return BN; //# Cn [9] <reserved-FFF0>..<reserved-FFF8> if ((val>=0xFFFE) && (val<=0xFFFF)) return BN; //# Cn [2] <noncharacter-FFFE>..<noncharacter-FFFF> if ((val>=0x1D173) && (val<=0x1D17A)) return BN; //# Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE if ((val>=0x1FFFE) && (val<=0x1FFFF)) return BN; //# Cn [2] <noncharacter-1FFFE>..<noncharacter-1FFFF> if ((val>=0x2FFFE) && (val<=0x2FFFF)) return BN; //# Cn [2] <noncharacter-2FFFE>..<noncharacter-2FFFF> if ((val>=0x3FFFE) && (val<=0x3FFFF)) return BN; //# Cn [2] <noncharacter-3FFFE>..<noncharacter-3FFFF> if ((val>=0x4FFFE) && (val<=0x4FFFF)) return BN; //# Cn [2] <noncharacter-4FFFE>..<noncharacter-4FFFF> if ((val>=0x5FFFE) && (val<=0x5FFFF)) return BN; //# Cn [2] <noncharacter-5FFFE>..<noncharacter-5FFFF> if ((val>=0x6FFFE) && (val<=0x6FFFF)) return BN; //# Cn [2] <noncharacter-6FFFE>..<noncharacter-6FFFF> if ((val>=0x7FFFE) && (val<=0x7FFFF)) return BN; //# Cn [2] <noncharacter-7FFFE>..<noncharacter-7FFFF> if ((val>=0x8FFFE) && (val<=0x8FFFF)) return BN; //# Cn [2] <noncharacter-8FFFE>..<noncharacter-8FFFF> if ((val>=0x9FFFE) && (val<=0x9FFFF)) return BN; //# Cn [2] <noncharacter-9FFFE>..<noncharacter-9FFFF> if ((val>=0xAFFFE) && (val<=0xAFFFF)) return BN; //# Cn [2] <noncharacter-AFFFE>..<noncharacter-AFFFF> if ((val>=0xBFFFE) && (val<=0xBFFFF)) return BN; //# Cn [2] <noncharacter-BFFFE>..<noncharacter-BFFFF> if ((val>=0xCFFFE) && (val<=0xCFFFF)) return BN; //# Cn [2] <noncharacter-CFFFE>..<noncharacter-CFFFF> if ((val>=0xDFFFE) && (val<=0xE0000)) return BN; //# Cn [3] <noncharacter-DFFFE>..<reserved-E0000> if (val==0x000E0001) return BN; //# Cf LANGUAGE TAG if ((val>=0xE0002) && (val<=0xE001F)) return BN; //# Cn [30] <reserved-E0002>..<reserved-E001F> if ((val>=0xE0020) && (val<=0xE007F)) return BN; //# Cf [96] TAG SPACE..CANCEL TAG if ((val>=0xE0080) && (val<=0xE00FF)) return BN; //# Cn [128] <reserved-E0080>..<reserved-E00FF> if ((val>=0xE01F0) && (val<=0xE0FFF)) return BN; //# Cn [3600] <reserved-E01F0>..<reserved-E0FFF> if ((val>=0xEFFFE) && (val<=0xEFFFF)) return BN; //# Cn [2] <noncharacter-EFFFE>..<noncharacter-EFFFF> if ((val>=0xFFFFE) && (val<=0xFFFFF)) return BN; //# Cn [2] <noncharacter-FFFFE>..<noncharacter-FFFFF> if ((val>=0x10FFFE) && (val<=0x10FFFF)) return BN; //# Cn [2] <noncharacter-10FFFE>..<noncharacter-10FFFF> if ((val>=0x0300) && (val<=0x036F)) return NSM; //# Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X if ((val>=0x0483) && (val<=0x0486)) return NSM; //# Mn [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA if ((val>=0x0488) && (val<=0x0489)) return NSM; //# Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN if ((val>=0x0591) && (val<=0x05BD)) return NSM; //# Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG if (val==0x000005BF) return NSM; //# Mn HEBREW POINT RAFE if ((val>=0x05C1) && (val<=0x05C2)) return NSM; //# Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT if ((val>=0x05C4) && (val<=0x05C5)) return NSM; //# Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT if (val==0x000005C7) return NSM; //# Mn HEBREW POINT QAMATS QATAN if ((val>=0x0610) && (val<=0x0615)) return NSM; //# Mn [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH if ((val>=0x064B) && (val<=0x065E)) return NSM; //# Mn [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS if (val==0x00000670) return NSM; //# Mn ARABIC LETTER SUPERSCRIPT ALEF if ((val>=0x06D6) && (val<=0x06DC)) return NSM; //# Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN if (val==0x000006DE) return NSM; //# Me ARABIC START OF RUB EL HIZB if ((val>=0x06DF) && (val<=0x06E4)) return NSM; //# Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA if ((val>=0x06E7) && (val<=0x06E8)) return NSM; //# Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON if ((val>=0x06EA) && (val<=0x06ED)) return NSM; //# Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM if (val==0x00000711) return NSM; //# Mn SYRIAC LETTER SUPERSCRIPT ALAPH if ((val>=0x0730) && (val<=0x074A)) return NSM; //# Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH if ((val>=0x07A6) && (val<=0x07B0)) return NSM; //# Mn [11] THAANA ABAFILI..THAANA SUKUN if ((val>=0x07EB) && (val<=0x07F3)) return NSM; //# Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE if ((val>=0x0901) && (val<=0x0902)) return NSM; //# Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA if (val==0x0000093C) return NSM; //# Mn DEVANAGARI SIGN NUKTA if ((val>=0x0941) && (val<=0x0948)) return NSM; //# Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI if (val==0x0000094D) return NSM; //# Mn DEVANAGARI SIGN VIRAMA if ((val>=0x0951) && (val<=0x0954)) return NSM; //# Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT if ((val>=0x0962) && (val<=0x0963)) return NSM; //# Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL if (val==0x00000981) return NSM; //# Mn BENGALI SIGN CANDRABINDU if (val==0x000009BC) return NSM; //# Mn BENGALI SIGN NUKTA if ((val>=0x09C1) && (val<=0x09C4)) return NSM; //# Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR if (val==0x000009CD) return NSM; //# Mn BENGALI SIGN VIRAMA if ((val>=0x09E2) && (val<=0x09E3)) return NSM; //# Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL if ((val>=0x0A01) && (val<=0x0A02)) return NSM; //# Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI if (val==0x00000A3C) return NSM; //# Mn GURMUKHI SIGN NUKTA if ((val>=0x0A41) && (val<=0x0A42)) return NSM; //# Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU if ((val>=0x0A47) && (val<=0x0A48)) return NSM; //# Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI if ((val>=0x0A4B) && (val<=0x0A4D)) return NSM; //# Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA if ((val>=0x0A70) && (val<=0x0A71)) return NSM; //# Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK if ((val>=0x0A81) && (val<=0x0A82)) return NSM; //# Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA if (val==0x00000ABC) return NSM; //# Mn GUJARATI SIGN NUKTA if ((val>=0x0AC1) && (val<=0x0AC5)) return NSM; //# Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E if ((val>=0x0AC7) && (val<=0x0AC8)) return NSM; //# Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI if (val==0x00000ACD) return NSM; //# Mn GUJARATI SIGN VIRAMA if ((val>=0x0AE2) && (val<=0x0AE3)) return NSM; //# Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL if (val==0x00000B01) return NSM; //# Mn ORIYA SIGN CANDRABINDU if (val==0x00000B3C) return NSM; //# Mn ORIYA SIGN NUKTA if (val==0x00000B3F) return NSM; //# Mn ORIYA VOWEL SIGN I if ((val>=0x0B41) && (val<=0x0B43)) return NSM; //# Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R if (val==0x00000B4D) return NSM; //# Mn ORIYA SIGN VIRAMA if (val==0x00000B56) return NSM; //# Mn ORIYA AI LENGTH MARK if (val==0x00000B82) return NSM; //# Mn TAMIL SIGN ANUSVARA if (val==0x00000BC0) return NSM; //# Mn TAMIL VOWEL SIGN II if (val==0x00000BCD) return NSM; //# Mn TAMIL SIGN VIRAMA if ((val>=0x0C3E) && (val<=0x0C40)) return NSM; //# Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II if ((val>=0x0C46) && (val<=0x0C48)) return NSM; //# Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI if ((val>=0x0C4A) && (val<=0x0C4D)) return NSM; //# Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA if ((val>=0x0C55) && (val<=0x0C56)) return NSM; //# Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK if (val==0x00000CBC) return NSM; //# Mn KANNADA SIGN NUKTA if ((val>=0x0CCC) && (val<=0x0CCD)) return NSM; //# Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA if ((val>=0x0CE2) && (val<=0x0CE3)) return NSM; //# Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL if ((val>=0x0D41) && (val<=0x0D43)) return NSM; //# Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R if (val==0x00000D4D) return NSM; //# Mn MALAYALAM SIGN VIRAMA if (val==0x00000DCA) return NSM; //# Mn SINHALA SIGN AL-LAKUNA if ((val>=0x0DD2) && (val<=0x0DD4)) return NSM; //# Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA if (val==0x00000DD6) return NSM; //# Mn SINHALA VOWEL SIGN DIGA PAA-PILLA if (val==0x00000E31) return NSM; //# Mn THAI CHARACTER MAI HAN-AKAT if ((val>=0x0E34) && (val<=0x0E3A)) return NSM; //# Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU if ((val>=0x0E47) && (val<=0x0E4E)) return NSM; //# Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN if (val==0x00000EB1) return NSM; //# Mn LAO VOWEL SIGN MAI KAN if ((val>=0x0EB4) && (val<=0x0EB9)) return NSM; //# Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU if ((val>=0x0EBB) && (val<=0x0EBC)) return NSM; //# Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO if ((val>=0x0EC8) && (val<=0x0ECD)) return NSM; //# Mn [6] LAO TONE MAI EK..LAO NIGGAHITA if ((val>=0x0F18) && (val<=0x0F19)) return NSM; //# Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS if (val==0x00000F35) return NSM; //# Mn TIBETAN MARK NGAS BZUNG NYI ZLA if (val==0x00000F37) return NSM; //# Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS if (val==0x00000F39) return NSM; //# Mn TIBETAN MARK TSA -PHRU if ((val>=0x0F71) && (val<=0x0F7E)) return NSM; //# Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO if ((val>=0x0F80) && (val<=0x0F84)) return NSM; //# Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA if ((val>=0x0F86) && (val<=0x0F87)) return NSM; //# Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS if ((val>=0x0F90) && (val<=0x0F97)) return NSM; //# Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA if ((val>=0x0F99) && (val<=0x0FBC)) return NSM; //# Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA if (val==0x00000FC6) return NSM; //# Mn TIBETAN SYMBOL PADMA GDAN if ((val>=0x102D) && (val<=0x1030)) return NSM; //# Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU if (val==0x00001032) return NSM; //# Mn MYANMAR VOWEL SIGN AI if ((val>=0x1036) && (val<=0x1037)) return NSM; //# Mn [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW if (val==0x00001039) return NSM; //# Mn MYANMAR SIGN VIRAMA if ((val>=0x1058) && (val<=0x1059)) return NSM; //# Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL if (val==0x0000135F) return NSM; //# Mn ETHIOPIC COMBINING GEMINATION MARK if ((val>=0x1712) && (val<=0x1714)) return NSM; //# Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA if ((val>=0x1732) && (val<=0x1734)) return NSM; //# Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD if ((val>=0x1752) && (val<=0x1753)) return NSM; //# Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U if ((val>=0x1772) && (val<=0x1773)) return NSM; //# Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U if ((val>=0x17B7) && (val<=0x17BD)) return NSM; //# Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA if (val==0x000017C6) return NSM; //# Mn KHMER SIGN NIKAHIT if ((val>=0x17C9) && (val<=0x17D3)) return NSM; //# Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT if (val==0x000017DD) return NSM; //# Mn KHMER SIGN ATTHACAN if ((val>=0x180B) && (val<=0x180D)) return NSM; //# Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE if (val==0x000018A9) return NSM; //# Mn MONGOLIAN LETTER ALI GALI DAGALGA if ((val>=0x1920) && (val<=0x1922)) return NSM; //# Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U if ((val>=0x1927) && (val<=0x1928)) return NSM; //# Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O if ((val>=0x1929) && (val<=0x192B)) return NSM; //# Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA if (val==0x00001932) return NSM; //# Mn LIMBU SMALL LETTER ANUSVARA if ((val>=0x1939) && (val<=0x193B)) return NSM; //# Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I if ((val>=0x1A17) && (val<=0x1A18)) return NSM; //# Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U if ((val>=0x1B00) && (val<=0x1B03)) return NSM; //# Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG if (val==0x00001B34) return NSM; //# Mn BALINESE SIGN REREKAN if ((val>=0x1B36) && (val<=0x1B3A)) return NSM; //# Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA if (val==0x00001B3C) return NSM; //# Mn BALINESE VOWEL SIGN LA LENGA if (val==0x00001B42) return NSM; //# Mn BALINESE VOWEL SIGN PEPET if ((val>=0x1B6B) && (val<=0x1B73)) return NSM; //# Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG if ((val>=0x1DC0) && (val<=0x1DCA)) return NSM; //# Mn [11] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER R BELOW if ((val>=0x1DFE) && (val<=0x1DFF)) return NSM; //# Mn [2] COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW if ((val>=0x20D0) && (val<=0x20DC)) return NSM; //# Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE if ((val>=0x20DD) && (val<=0x20E0)) return NSM; //# Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH if (val==0x000020E1) return NSM; //# Mn COMBINING LEFT RIGHT ARROW ABOVE if ((val>=0x20E2) && (val<=0x20E4)) return NSM; //# Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE if ((val>=0x20E5) && (val<=0x20EF)) return NSM; //# Mn [11] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING RIGHT ARROW BELOW if ((val>=0x302A) && (val<=0x302F)) return NSM; //# Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK if ((val>=0x3099) && (val<=0x309A)) return NSM; //# Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK if (val==0x0000A802) return NSM; //# Mc SYLOTI NAGRI SIGN DVISVARA if (val==0x0000A806) return NSM; //# Mn SYLOTI NAGRI SIGN HASANTA if (val==0x0000A80B) return NSM; //# Mn SYLOTI NAGRI SIGN ANUSVARA if ((val>=0xA825) && (val<=0xA826)) return NSM; //# Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E if (val==0x0000FB1E) return NSM; //# Mn HEBREW POINT JUDEO-SPANISH VARIKA if ((val>=0xFE00) && (val<=0xFE0F)) return NSM; //# Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 if ((val>=0xFE20) && (val<=0xFE23)) return NSM; //# Mn [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF if ((val>=0x10A01) && (val<=0x10A03)) return NSM; //# Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R if ((val>=0x10A05) && (val<=0x10A06)) return NSM; //# Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O if ((val>=0x10A0C) && (val<=0x10A0F)) return NSM; //# Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA if ((val>=0x10A38) && (val<=0x10A3A)) return NSM; //# Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW if (val==0x00010A3F) return NSM; //# Mn KHAROSHTHI VIRAMA if ((val>=0x1D167) && (val<=0x1D169)) return NSM; //# Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 if ((val>=0x1D17B) && (val<=0x1D182)) return NSM; //# Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE if ((val>=0x1D185) && (val<=0x1D18B)) return NSM; //# Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE if ((val>=0x1D1AA) && (val<=0x1D1AD)) return NSM; //# Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO if ((val>=0x1D242) && (val<=0x1D244)) return NSM; //# Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME if ((val>=0xE0100) && (val<=0xE01EF)) return NSM; //# Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 if ((val>=0x0600) && (val<=0x0603)) return AL; //# Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA if ((val>=0x0604) && (val<=0x060A)) return AL; //# Cn [7] <reserved-0604>..<reserved-060A> if (val==0x0000060B) return AL; //# Sc AFGHANI SIGN if (val==0x0000060D) return AL; //# Po ARABIC DATE SEPARATOR if ((val>=0x0616) && (val<=0x061A)) return AL; //# Cn [5] <reserved-0616>..<reserved-061A> if (val==0x0000061B) return AL; //# Po ARABIC SEMICOLON if ((val>=0x061C) && (val<=0x061D)) return AL; //# Cn [2] <reserved-061C>..<reserved-061D> if ((val>=0x061E) && (val<=0x061F)) return AL; //# Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK if (val==0x00000620) return AL; //# Cn <reserved-0620> if ((val>=0x0621) && (val<=0x063A)) return AL; //# Lo [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN if ((val>=0x063B) && (val<=0x063F)) return AL; //# Cn [5] <reserved-063B>..<reserved-063F> if (val==0x00000640) return AL; //# Lm ARABIC TATWEEL if ((val>=0x0641) && (val<=0x064A)) return AL; //# Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH if (val==0x0000065F) return AL; //# Cn <reserved-065F> if (val==0x0000066D) return AL; //# Po ARABIC FIVE POINTED STAR if ((val>=0x066E) && (val<=0x066F)) return AL; //# Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF if ((val>=0x0671) && (val<=0x06D3)) return AL; //# Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE if (val==0x000006D4) return AL; //# Po ARABIC FULL STOP if (val==0x000006D5) return AL; //# Lo ARABIC LETTER AE if (val==0x000006DD) return AL; //# Cf ARABIC END OF AYAH if ((val>=0x06E5) && (val<=0x06E6)) return AL; //# Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH if ((val>=0x06EE) && (val<=0x06EF)) return AL; //# Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V if ((val>=0x06FA) && (val<=0x06FC)) return AL; //# Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW if ((val>=0x06FD) && (val<=0x06FE)) return AL; //# So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN if (val==0x000006FF) return AL; //# Lo ARABIC LETTER HEH WITH INVERTED V if ((val>=0x0700) && (val<=0x070D)) return AL; //# Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS if (val==0x0000070E) return AL; //# Cn <reserved-070E> if (val==0x00000710) return AL; //# Lo SYRIAC LETTER ALAPH if ((val>=0x0712) && (val<=0x072F)) return AL; //# Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH if ((val>=0x074B) && (val<=0x074C)) return AL; //# Cn [2] <reserved-074B>..<reserved-074C> if ((val>=0x074D) && (val<=0x076D)) return AL; //# Lo [33] SYRIAC LETTER SOGDIAN ZHAIN..ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE if ((val>=0x076E) && (val<=0x077F)) return AL; //# Cn [18] <reserved-076E>..<reserved-077F> if ((val>=0x0780) && (val<=0x07A5)) return AL; //# Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU if (val==0x000007B1) return AL; //# Lo THAANA LETTER NAA if ((val>=0x07B2) && (val<=0x07BF)) return AL; //# Cn [14] <reserved-07B2>..<reserved-07BF> if ((val>=0xFB50) && (val<=0xFBB1)) return AL; //# Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM if ((val>=0xFBB2) && (val<=0xFBD2)) return AL; //# Cn [33] <reserved-FBB2>..<reserved-FBD2> if ((val>=0xFBD3) && (val<=0xFD3D)) return AL; //# Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM if ((val>=0xFD40) && (val<=0xFD4F)) return AL; //# Cn [16] <reserved-FD40>..<reserved-FD4F> if ((val>=0xFD50) && (val<=0xFD8F)) return AL; //# Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM if ((val>=0xFD90) && (val<=0xFD91)) return AL; //# Cn [2] <reserved-FD90>..<reserved-FD91> if ((val>=0xFD92) && (val<=0xFDC7)) return AL; //# Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM if ((val>=0xFDC8) && (val<=0xFDCF)) return AL; //# Cn [8] <reserved-FDC8>..<reserved-FDCF> if ((val>=0xFDF0) && (val<=0xFDFB)) return AL; //# Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU if (val==0x0000FDFC) return AL; //# Sc RIAL SIGN if ((val>=0xFDFE) && (val<=0xFDFF)) return AL; //# Cn [2] <reserved-FDFE>..<reserved-FDFF> if ((val>=0xFE70) && (val<=0xFE74)) return AL; //# Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM if (val==0x0000FE75) return AL; //# Cn <reserved-FE75> if ((val>=0xFE76) && (val<=0xFEFC)) return AL; //# Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM if ((val>=0xFEFD) && (val<=0xFEFE)) return AL; //# Cn [2] <reserved-FEFD>..<reserved-FEFE> if (val==0x0000202D) return LRO; //# Cf LEFT-TO-RIGHT OVERRIDE if (val==0x0000202E) return RLO; //# Cf RIGHT-TO-LEFT OVERRIDE if (val==0x0000202A) return LRE; //# Cf LEFT-TO-RIGHT EMBEDDING if (val==0x0000202B) return RLE; //# Cf RIGHT-TO-LEFT EMBEDDING if (val==0x0000202C) return PDF; //# Cf POP DIRECTIONAL FORMATTING return L; }