API 0.9.5
Foundation/CPCharacterSet.j
Go to the documentation of this file.
00001 /*
00002  * CPCharacterSet.j
00003  * Foundation
00004  *
00005  * Copyright 2008, Emanuele Vulcano
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00020  */
00021 
00022 
00023 // CPCharacterSet is a class cluster. Concrete implementations
00024 // follow after the main abstract class.
00025 
00026 var _builtInCharacterSets = {};
00027 
00028 @implementation CPCharacterSet : CPObject
00029 {
00030     BOOL _inverted;
00031 }
00032 
00033 // Missing methods
00034 /*
00035 - (BOOL)isSupersetOfSet:(CPCharacterSet)theOtherSet{}
00036 + (id)characterSetWithBitmapRepresentation:(CPData)data{}
00037 + (id)characterSetWithContentsOfFile:(CPString)path{}
00038 - (CPData)bitmapRepresentation{}
00039 
00040 - (void)formIntersectionWithCharacterSet:(CPCharacterSet)otherSet
00041 - (void)formUnionWithCharacterSet:(CPCharacterSet)otherSet
00042 - (void)removeCharactersInRange:(CPRange)aRange
00043 - (void)removeCharactersInString:(CPString)aString
00044 */
00045 
00046 - (id)init
00047 {
00048     self = [super init];
00049 
00050     if (self)
00051         _inverted = NO;
00052 
00053     return self;
00054 }
00055 
00056 - (void)invert
00057 {
00058     _inverted = !_inverted;
00059 }
00060 
00061 - (BOOL)characterIsMember:(CPString)aCharacter
00062 {
00063     // IMPLEMENTED BY SUBCLASSES
00064 }
00065 
00066 - (BOOL)hasMemberInPlane:(int)aPlane
00067 {
00068     // IMPLEMENTED BY SUBCLASSES
00069 }
00070 
00071 + (id)characterSetWithCharactersInString:(CPString)aString
00072 {
00073     return [[_CPStringContentCharacterSet alloc] initWithString:aString];
00074 }
00075 
00076 + (id)characterSetWithRange:(CPRange)aRange
00077 {
00078     return [[_CPRangeCharacterSet alloc] initWithRange:aRange];
00079 }
00080 
00081 + (id)alphanumericCharacterSet
00082 {
00083     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00084 }
00085 
00086 + (id)controlCharacterSet
00087 {
00088     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00089 }
00090 
00091 + (id)decimalDigitCharacterSet
00092 {
00093     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00094 }
00095 
00096 + (id)decomposableCharacterSet
00097 {
00098     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00099 }
00100 
00101 + (id)illegalCharacterSet
00102 {
00103     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00104 }
00105 
00106 + (id)letterCharacterSet
00107 {
00108     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00109 }
00110 
00111 + (id)lowercaseLetterCharacterSet
00112 {
00113     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00114 }
00115 
00116 + (id)nonBaseCharacterSet
00117 {
00118     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00119 }
00120 
00121 + (id)punctuationCharacterSet
00122 {
00123     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00124 }
00125 
00126 + (id)uppercaseLetterCharacterSet
00127 {
00128     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00129 }
00130 
00131 + (id)whitespaceAndNewlineCharacterSet
00132 {
00133     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00134 }
00135 
00136 + (id)whitespaceCharacterSet
00137 {
00138     return [CPCharacterSet _sharedCharacterSetWithName:_cmd];
00139 }
00140 
00141 // private methods
00142 + (id)_sharedCharacterSetWithName:(id)csname
00143 {
00144     var cs = _builtInCharacterSets[csname];
00145     if (cs == nil)
00146     {
00147         var i = 0,
00148             ranges = [CPArray array],
00149             rangeArray = eval(csname);
00150 
00151         for (; i < rangeArray.length; i+= 2)
00152         {
00153             var loc = rangeArray[i],
00154                 length = rangeArray[i + 1],
00155                 range = CPMakeRange(loc,length);
00156             [ranges addObject:range];
00157         }
00158         cs = [[_CPRangeCharacterSet alloc] initWithRanges:ranges];
00159         _builtInCharacterSets[csname] = cs;
00160     }
00161 
00162     return cs;
00163 }
00164 
00165 - (void)_setInverted:flag
00166 {
00167     _inverted = flag;
00168 }
00169 
00170 @end
00171 
00172 var CPCharacterSetInvertedKey = @"CPCharacterSetInvertedKey";
00173 
00174 @implementation CPCharacterSet (CPCoding)
00175 
00176 - (id)initWithCoder:(CPCoder)aCoder
00177 {
00178     if (self = [super init])
00179     {
00180         _inverted = [aCoder decodeBoolForKey:CPCharacterSetInvertedKey];
00181     }
00182 
00183     return self;
00184 }
00185 
00186 - (void)encodeWithCoder:(CPCoder)aCoder
00187 {
00188     [aCoder encodeBool:_inverted forKey:CPCharacterSetInvertedKey];
00189 }
00190 
00191 @end
00192 
00193 // A character set that stores a list of ranges of
00194 // acceptable characters.
00195 @implementation _CPRangeCharacterSet : CPCharacterSet
00196 {
00197     CPArray _ranges;
00198 }
00199 
00200 // Creates a range character set with a single range.
00201 - (id)initWithRange:(CPRange)r
00202 {
00203     return [self initWithRanges:[CPArray arrayWithObject:r]];
00204 }
00205 
00206 // Creates a range character set with multiple ranges.
00207 - (id)initWithRanges:(CPArray)ranges
00208 {
00209     self = [super init];
00210 
00211     if (self)
00212     {
00213         _ranges = ranges;
00214     }
00215 
00216     return self;
00217 }
00218 
00219 - (id)copy
00220 {
00221     var set = [[_CPRangeCharacterSet alloc] initWithRanges:_ranges];
00222     [set _setInverted:_inverted];
00223     return set;
00224 }
00225 
00226 - (id)invertedSet
00227 {
00228     var set = [[_CPRangeCharacterSet alloc] initWithRanges:_ranges];
00229     [set invert];
00230     return set;
00231 }
00232 
00233 - (BOOL)characterIsMember:(CPString)aCharacter
00234 {
00235     c = aCharacter.charCodeAt(0);
00236     var enu = [_ranges objectEnumerator],
00237         range;
00238 
00239     while (range = [enu nextObject])
00240     {
00241         if (CPLocationInRange(c, range))
00242             return !_inverted;
00243     }
00244 
00245     return _inverted;
00246 }
00247 
00248 - (BOOL)hasMemberInPlane:(int)plane // TO DO : when inverted
00249 {
00250     // FIXME: range is undefined... don't know what's supposed to be going on here.
00251     // the highest Unicode plane we reach.
00252     // (There are 65536 code points in each plane.)
00253     var maxPlane = Math.floor((range.start + range.length - 1) / 65536); // FIXME: should iterate _ranges
00254 
00255     return (plane <= maxPlane);
00256 }
00257 
00258 - (void)addCharactersInRange:(CPRange)aRange // Needs _inverted support
00259 {
00260         [_ranges addObject:aRange];
00261 }
00262 
00263 - (void)addCharactersInString:(CPString)aString // Needs _inverted support
00264 {
00265     var i = 0;
00266 
00267     for (; i < aString.length; i++)
00268     {
00269         var code = aString.charCodeAt(i),
00270             range = CPMakeRange(code,1);
00271 
00272         [_ranges addObject:range];
00273     }
00274 }
00275 
00276 @end
00277 
00278 // A character set that scans a string's contents for
00279 // acceptable characters.
00280 @implementation _CPStringContentCharacterSet : CPCharacterSet
00281 {
00282     CPString _string;
00283 }
00284 
00285 - (id)initWithString:(CPString)s
00286 {
00287     self = [super init];
00288 
00289     if (self)
00290     {
00291         _string = s;
00292     }
00293 
00294     return self;
00295 }
00296 
00297 - (id)copy
00298 {
00299     var set = [[_CPStringContentCharacterSet alloc] initWithString:_string];
00300     [set _setInverted:_inverted];
00301 
00302     return set;
00303 }
00304 
00305 - (id)invertedSet
00306 {
00307     var set = [[_CPStringContentCharacterSet alloc] initWithString:_string];
00308     [set invert];
00309 
00310     return set;
00311 }
00312 
00313 - (BOOL)characterIsMember:(CPString)c
00314 {
00315     return (_string.indexOf(c.charAt(0)) != -1) == !_inverted;
00316 }
00317 
00318 - (CPString)description
00319 {
00320     return [super description] + " { string = '" + _string + "'}";
00321 }
00322 
00323 - (BOOL)hasMemberInPlane:(int)plane
00324 {
00325     // JavaScript strings can only return char codes
00326     // up to 0xFFFF (per the ECMA standard), so
00327     // they all live in the Basic Multilingual Plane
00328     // (aka plane 0).
00329     // TODO if the above is wrong, this must be changed!
00330 
00331     return plane == 0;
00332 }
00333 
00334 - (void)addCharactersInRange:(CPRange)aRange // Needs _inverted support
00335 {
00336     var i = aRange.location,
00337         count = aRange.location + aRange.length;
00338 
00339     for (; i < count; i++)
00340     {
00341         var s = String.fromCharCode(i);
00342 
00343         if (![self characterIsMember:s])
00344             _string = [_string stringByAppendingString:s];
00345     }
00346 }
00347 
00348 - (void)addCharactersInString:(CPString)aString // Needs _inverted support
00349 {
00350     var i = 0;
00351 
00352     for (; i < aString.length; i++)
00353     {
00354         var s = aString.charAt(i);
00355 
00356         if (![self characterIsMember:s])
00357             _string = [_string stringByAppendingString:s];
00358     }
00359 }
00360 
00361 - (BOOL)isEqual:(CPCharacterSet)aCharacterSet
00362 {
00363     if (self === aCharacterSet)
00364         return YES;
00365 
00366     if (!aCharacterSet || ![aCharacterSet isKindOfClass:[self class]])
00367         return NO;
00368 
00369     return [self _isEqualToStringContentCharacterSet:aCharacterSet];
00370 }
00371 
00372 - (BOOL)_isEqualToStringContentCharacterSet:(_CPStringContentCharacterSet)aCharacterSet
00373 {
00374     if (!aCharacterSet)
00375         return NO;
00376 
00377     return _string == aCharacterSet._string && _inverted == aCharacterSet._inverted;
00378 }
00379 
00380 @end
00381 
00382 var _CPStringContentCharacterSetStringKey = @"_CPStringContentCharacterSetStringKey";
00383 
00384 @implementation _CPStringContentCharacterSet (CPCoding)
00385 
00386 - (id)initWithCoder:(CPCoder)aCoder
00387 {
00388     if (self = [super initWithCoder:aCoder])
00389     {
00390         _string = [aCoder decodeObjectForKey:_CPStringContentCharacterSetStringKey]
00391     }
00392 
00393     return self;
00394 }
00395 
00396 - (void)encodeWithCoder:(CPCoder)aCoder
00397 {
00398     [super encodeWithCoder:aCoder];
00399 
00400     [aCoder encodeObject:_string forKey:_CPStringContentCharacterSetStringKey];
00401 }
00402 
00403 @end
00404 
00405 _CPCharacterSetTrimAtBeginning  = 1 << 1;
00406 _CPCharacterSetTrimAtEnd        = 1 << 2;
00407 
00408 @implementation CPString (CPCharacterSetAdditions)
00409 
00422 - (CPArray)componentsSeparatedByCharactersInSet:(CPCharacterSet)separator
00423 {
00424     if (!separator)
00425         [CPException raise:CPInvalidArgumentException
00426                     reason:"componentsSeparatedByCharactersInSet: the separator can't be 'nil'"];
00427 
00428     var components = [CPMutableArray array],
00429         componentRange = CPMakeRange(0, 0),
00430         i = 0;
00431 
00432     for (; i < self.length; i++)
00433     {
00434         if ([separator characterIsMember:self.charAt(i)])
00435         {
00436             componentRange.length = i - componentRange.location;
00437             [components addObject:[self substringWithRange:componentRange]];
00438             componentRange.location += componentRange.length + 1;
00439         }
00440     }
00441 
00442     componentRange.length = self.length - componentRange.location;
00443     [components addObject:[self substringWithRange:componentRange]];
00444 
00445     return components;
00446 }
00447 
00448 // As per the Cocoa method.
00449 - (id)stringByTrimmingCharactersInSet:(CPCharacterSet)set
00450 {
00451     return [self _stringByTrimmingCharactersInSet:set options:_CPCharacterSetTrimAtBeginning | _CPCharacterSetTrimAtEnd];
00452 }
00453 
00454 // private method evilness!
00455 // CPScanner's scanUpToString:... methods rely on this
00456 // method being present.
00457 - (id)_stringByTrimmingCharactersInSet:(CPCharacterSet)set options:(int)options
00458 {
00459     var str = self;
00460 
00461     if (options & _CPCharacterSetTrimAtBeginning)
00462     {
00463         var cutEdgeBeginning = 0;
00464 
00465         while (cutEdgeBeginning < self.length && [set characterIsMember:self.charAt(cutEdgeBeginning)])
00466             cutEdgeBeginning++;
00467 
00468         str = str.substr(cutEdgeBeginning);
00469     }
00470 
00471     if (options & _CPCharacterSetTrimAtEnd)
00472     {
00473         var cutEdgeEnd = str.length;
00474 
00475         while (cutEdgeEnd > 0 && [set characterIsMember:self.charAt(cutEdgeEnd)])
00476             cutEdgeEnd--;
00477 
00478         str = str.substr(0, cutEdgeEnd + 1);
00479     }
00480 
00481     return str;
00482 }
00483 
00484 @end
00485 
00486 alphanumericCharacterSet = [
00487 48,10,
00488 65,26,
00489 97,26,
00490 170,1,
00491 178,2,
00492 181,1,
00493 185,2,
00494 188,3,
00495 192,23,
00496 216,31,
00497 248,458,
00498 710,12,
00499 736,5,
00500 750,1,
00501 768,112,
00502 890,4,
00503 902,1,
00504 904,3,
00505 908,1,
00506 910,20,
00507 931,44,
00508 976,38,
00509 1015,139,
00510 1155,4,
00511 1160,140,
00512 1329,38,
00513 1369,1,
00514 1377,39,
00515 1425,45,
00516 1471,1,
00517 1473,2,
00518 1476,2,
00519 1479,1,
00520 1488,27,
00521 1520,3,
00522 1552,6,
00523 1569,26,
00524 1600,31,
00525 1632,10,
00526 1646,102,
00527 1749,8,
00528 1758,11,
00529 1770,19,
00530 1791,1,
00531 1808,59,
00532 1869,33,
00533 1920,50,
00534 1984,54,
00535 2042,1,
00536 2305,57,
00537 2364,18,
00538 2384,5,
00539 2392,12,
00540 2406,10,
00541 2427,5,
00542 2433,3,
00543 2437,8,
00544 2447,2,
00545 2451,22,
00546 2474,7,
00547 2482,1,
00548 2486,4,
00549 2492,9,
00550 2503,2,
00551 2507,4,
00552 2519,1,
00553 2524,2,
00554 2527,5,
00555 2534,12,
00556 2548,6,
00557 2561,3,
00558 2565,6,
00559 2575,2,
00560 2579,22,
00561 2602,7,
00562 2610,2,
00563 2613,2,
00564 2616,2,
00565 2620,1,
00566 2622,5,
00567 2631,2,
00568 2635,3,
00569 2649,4,
00570 2654,1,
00571 2662,15,
00572 2689,3,
00573 2693,9,
00574 2703,3,
00575 2707,22,
00576 2730,7,
00577 2738,2,
00578 2741,5,
00579 2748,10,
00580 2759,3,
00581 2763,3,
00582 2768,1,
00583 2784,4,
00584 2790,10,
00585 2817,3,
00586 2821,8,
00587 2831,2,
00588 2835,22,
00589 2858,7,
00590 2866,2,
00591 2869,5,
00592 2876,8,
00593 2887,2,
00594 2891,3,
00595 2902,2,
00596 2908,2,
00597 2911,3,
00598 2918,10,
00599 2929,1,
00600 2946,2,
00601 2949,6,
00602 2958,3,
00603 2962,4,
00604 2969,2,
00605 2972,1,
00606 2974,2,
00607 2979,2,
00608 2984,3,
00609 2990,12,
00610 3006,5,
00611 3014,3,
00612 3018,4,
00613 3031,1,
00614 3046,13,
00615 3073,3,
00616 3077,8,
00617 3086,3,
00618 3090,23,
00619 3114,10,
00620 3125,5,
00621 3134,7,
00622 3142,3,
00623 3146,4,
00624 3157,2,
00625 3168,2,
00626 3174,10,
00627 3202,2,
00628 3205,8,
00629 3214,3,
00630 3218,23,
00631 3242,10,
00632 3253,5,
00633 3260,9,
00634 3270,3,
00635 3274,4,
00636 3285,2,
00637 3294,1,
00638 3296,4,
00639 3302,10,
00640 3330,2,
00641 3333,8,
00642 3342,3,
00643 3346,23,
00644 3370,16,
00645 3390,6,
00646 3398,3,
00647 3402,4,
00648 3415,1,
00649 3424,2,
00650 3430,10,
00651 3458,2,
00652 3461,18,
00653 3482,24,
00654 3507,9,
00655 3517,1,
00656 3520,7,
00657 3530,1,
00658 3535,6,
00659 3542,1,
00660 3544,8,
00661 3570,2,
00662 3585,58,
00663 3648,15,
00664 3664,10,
00665 3713,2,
00666 3716,1,
00667 3719,2,
00668 3722,1,
00669 3725,1,
00670 3732,4,
00671 3737,7,
00672 3745,3,
00673 3749,1,
00674 3751,1,
00675 3754,2,
00676 3757,13,
00677 3771,3,
00678 3776,5,
00679 3782,1,
00680 3784,6,
00681 3792,10,
00682 3804,2,
00683 3840,1,
00684 3864,2,
00685 3872,20,
00686 3893,1,
00687 3895,1,
00688 3897,1,
00689 3902,10,
00690 3913,34,
00691 3953,20,
00692 3974,6,
00693 3984,8,
00694 3993,36,
00695 4038,1,
00696 4096,34,
00697 4131,5,
00698 4137,2,
00699 4140,7,
00700 4150,4,
00701 4160,10,
00702 4176,10,
00703 4256,38,
00704 4304,43,
00705 4348,1,
00706 4352,90,
00707 4447,68,
00708 4520,82,
00709 4608,73,
00710 4682,4,
00711 4688,7,
00712 4696,1,
00713 4698,4,
00714 4704,41,
00715 4746,4,
00716 4752,33,
00717 4786,4,
00718 4792,7,
00719 4800,1,
00720 4802,4,
00721 4808,15,
00722 4824,57,
00723 4882,4,
00724 4888,67,
00725 4959,1,
00726 4969,20,
00727 4992,16,
00728 5024,85,
00729 5121,620,
00730 5743,8,
00731 5761,26,
00732 5792,75,
00733 5870,3,
00734 5888,13,
00735 5902,7,
00736 5920,21,
00737 5952,20,
00738 5984,13,
00739 5998,3,
00740 6002,2,
00741 6016,52,
00742 6070,30,
00743 6103,1,
00744 6108,2,
00745 6112,10,
00746 6128,10,
00747 6155,3,
00748 6160,10,
00749 6176,88,
00750 6272,42,
00751 6400,29,
00752 6432,12,
00753 6448,12,
00754 6470,40,
00755 6512,5,
00756 6528,42,
00757 6576,26,
00758 6608,10,
00759 6656,28,
00760 6912,76,
00761 6992,10,
00762 7019,9,
00763 7424,203,
00764 7678,158,
00765 7840,90,
00766 7936,22,
00767 7960,6,
00768 7968,38,
00769 8008,6,
00770 8016,8,
00771 8025,1,
00772 8027,1,
00773 8029,1,
00774 8031,31,
00775 8064,53,
00776 8118,7,
00777 8126,1,
00778 8130,3,
00779 8134,7,
00780 8144,4,
00781 8150,6,
00782 8160,13,
00783 8178,3,
00784 8182,7,
00785 8304,2,
00786 8308,6,
00787 8319,11,
00788 8336,5,
00789 8400,32,
00790 8450,1,
00791 8455,1,
00792 8458,10,
00793 8469,1,
00794 8473,5,
00795 8484,1,
00796 8486,1,
00797 8488,1,
00798 8490,4,
00799 8495,11,
00800 8508,4,
00801 8517,5,
00802 8526,1,
00803 8531,50,
00804 9312,60,
00805 9450,22,
00806 10102,30,
00807 11264,47,
00808 11312,47,
00809 11360,13,
00810 11380,4,
00811 11392,101,
00812 11517,1,
00813 11520,38,
00814 11568,54,
00815 11631,1,
00816 11648,23,
00817 11680,7,
00818 11688,7,
00819 11696,7,
00820 11704,7,
00821 11712,7,
00822 11720,7,
00823 11728,7,
00824 11736,7,
00825 12293,3,
00826 12321,15,
00827 12337,5,
00828 12344,5,
00829 12353,86,
00830 12441,2,
00831 12445,3,
00832 12449,90,
00833 12540,4,
00834 12549,40,
00835 12593,94,
00836 12690,4,
00837 12704,24,
00838 12784,16,
00839 12832,10,
00840 12881,15,
00841 12928,10,
00842 12977,15,
00843 13312,6582,
00844 19968,20924,
00845 40960,1165,
00846 42775,4,
00847 43008,40,
00848 43072,52,
00849 44032,11172,
00850 63744,302,
00851 64048,59,
00852 64112,106,
00853 64256,7,
00854 64275,5,
00855 64285,12,
00856 64298,13,
00857 64312,5,
00858 64318,1,
00859 64320,2,
00860 64323,2,
00861 64326,108,
00862 64467,363,
00863 64848,64,
00864 64914,54,
00865 65008,12,
00866 65024,16,
00867 65056,4,
00868 65136,5,
00869 65142,135,
00870 65296,10,
00871 65313,26,
00872 65345,26,
00873 65382,89,
00874 65474,6,
00875 65482,6,
00876 65490,6
00877 ];
00878 
00879 controlCharacterSet = [
00880 0,32,
00881 127,33,
00882 173,1,
00883 1536,4,
00884 1757,1,
00885 1807,1,
00886 6068,2,
00887 8203,5,
00888 8234,5,
00889 8288,4,
00890 8298,6,
00891 65279,1
00892 ];
00893 
00894 decimalDigitCharacterSet = [
00895 48,10,
00896 1632,10,
00897 1776,10,
00898 1984,10,
00899 2406,10,
00900 2534,10,
00901 2662,10,
00902 2790,10,
00903 2918,10,
00904 3046,10,
00905 3174,10,
00906 3302,10,
00907 3430,10,
00908 3664,10,
00909 3792,10,
00910 3872,10,
00911 4160,10,
00912 6112,10,
00913 6160,10,
00914 6470,10,
00915 6608,10,
00916 6992,10
00917 ];
00918 
00919 decomposableCharacterSet = [
00920 192,6,
00921 199,9,
00922 209,6,
00923 217,5,
00924 224,6,
00925 231,9,
00926 241,6,
00927 249,5,
00928 255,17,
00929 274,20,
00930 296,9,
00931 308,4,
00932 313,6,
00933 323,6,
00934 332,6,
00935 340,18,
00936 360,23,
00937 416,2,
00938 431,2,
00939 461,16,
00940 478,6,
00941 486,11,
00942 500,2,
00943 504,36,
00944 542,2,
00945 550,14,
00946 832,2,
00947 835,2,
00948 884,1,
00949 894,1,
00950 901,6,
00951 908,1,
00952 910,3,
00953 938,7,
00954 970,5,
00955 979,2,
00956 1024,2,
00957 1027,1,
00958 1031,1,
00959 1036,3,
00960 1049,1,
00961 1081,1,
00962 1104,2,
00963 1107,1,
00964 1111,1,
00965 1116,3,
00966 1142,2,
00967 1217,2,
00968 1232,4,
00969 1238,2,
00970 1242,6,
00971 1250,6,
00972 1258,12,
00973 1272,2,
00974 1570,5,
00975 1728,1,
00976 1730,1,
00977 1747,1,
00978 2345,1,
00979 2353,1,
00980 2356,1,
00981 2392,8,
00982 2507,2,
00983 2524,2,
00984 2527,1,
00985 2611,1,
00986 2614,1,
00987 2649,3,
00988 2654,1,
00989 2888,1,
00990 2891,2,
00991 2908,2,
00992 2964,1,
00993 3018,3,
00994 3144,1,
00995 3264,1,
00996 3271,2,
00997 3274,2,
00998 3402,3,
00999 3546,1,
01000 3548,3,
01001 3907,1,
01002 3917,1,
01003 3922,1,
01004 3927,1,
01005 3932,1,
01006 3945,1,
01007 3955,1,
01008 3957,2,
01009 3960,1,
01010 3969,1,
01011 3987,1,
01012 3997,1,
01013 4002,1,
01014 4007,1,
01015 4012,1,
01016 4025,1,
01017 4134,1,
01018 6918,1,
01019 6920,1,
01020 6922,1,
01021 6924,1,
01022 6926,1,
01023 6930,1,
01024 6971,1,
01025 6973,1,
01026 6976,2,
01027 6979,1,
01028 7680,154,
01029 7835,1,
01030 7840,90,
01031 7936,22,
01032 7960,6,
01033 7968,38,
01034 8008,6,
01035 8016,8,
01036 8025,1,
01037 8027,1,
01038 8029,1,
01039 8031,31,
01040 8064,53,
01041 8118,7,
01042 8126,1,
01043 8129,4,
01044 8134,14,
01045 8150,6,
01046 8157,19,
01047 8178,3,
01048 8182,8,
01049 8192,2,
01050 8486,1,
01051 8490,2,
01052 8602,2,
01053 8622,1,
01054 8653,3,
01055 8708,1,
01056 8713,1,
01057 8716,1,
01058 8740,1,
01059 8742,1,
01060 8769,1,
01061 8772,1,
01062 8775,1,
01063 8777,1,
01064 8800,1,
01065 8802,1,
01066 8813,5,
01067 8820,2,
01068 8824,2,
01069 8832,2,
01070 8836,2,
01071 8840,2,
01072 8876,4,
01073 8928,4,
01074 8938,4,
01075 9001,2,
01076 10972,1,
01077 12364,1,
01078 12366,1,
01079 12368,1,
01080 12370,1,
01081 12372,1,
01082 12374,1,
01083 12376,1,
01084 12378,1,
01085 12380,1,
01086 12382,1,
01087 12384,1,
01088 12386,1,
01089 12389,1,
01090 12391,1,
01091 12393,1,
01092 12400,2,
01093 12403,2,
01094 12406,2,
01095 12409,2,
01096 12412,2,
01097 12436,1,
01098 12446,1,
01099 12460,1,
01100 12462,1,
01101 12464,1,
01102 12466,1,
01103 12468,1,
01104 12470,1,
01105 12472,1,
01106 12474,1,
01107 12476,1,
01108 12478,1,
01109 12480,1,
01110 12482,1,
01111 12485,1,
01112 12487,1,
01113 12489,1,
01114 12496,2,
01115 12499,2,
01116 12502,2,
01117 12505,2,
01118 12508,2,
01119 12532,1,
01120 12535,4,
01121 12542,1,
01122 44032,11172,
01123 63744,270,
01124 64016,1,
01125 64018,1,
01126 64021,10,
01127 64032,1,
01128 64034,1,
01129 64037,2,
01130 64042,4,
01131 64048,59,
01132 64112,106,
01133 64285,1,
01134 64287,1,
01135 64298,13,
01136 64312,5,
01137 64318,1,
01138 64320,2,
01139 64323,2
01140 ];
01141 
01142 illegalCharacterSet = [
01143 880,4,
01144 886,4,
01145 895,5,
01146 907,1,
01147 909,1,
01148 930,1,
01149 975,1,
01150 1159,1,
01151 1300,29,
01152 1367,2,
01153 1376,1,
01154 1416,1,
01155 1419,6,
01156 1480,8,
01157 1515,5,
01158 1525,11,
01159 1540,7,
01160 1558,5,
01161 1564,2,
01162 1568,1,
01163 1595,5,
01164 1631,1,
01165 1806,1,
01166 1867,2,
01167 1902,18,
01168 1970,14,
01169 2043,262,
01170 2362,2,
01171 2382,2,
01172 2389,3,
01173 2417,10,
01174 2432,1,
01175 2436,1,
01176 2445,2,
01177 2449,2,
01178 2473,1,
01179 2481,1,
01180 2483,3,
01181 2490,2,
01182 2501,2,
01183 2505,2,
01184 2511,8,
01185 2520,4,
01186 2526,1,
01187 2532,2,
01188 2555,6,
01189 2564,1,
01190 2571,4,
01191 2577,2,
01192 2601,1,
01193 2609,1,
01194 2612,1,
01195 2615,1,
01196 2618,2,
01197 2621,1,
01198 2627,4,
01199 2633,2,
01200 2638,11,
01201 2653,1,
01202 2655,7,
01203 2677,12,
01204 2692,1,
01205 2702,1,
01206 2706,1,
01207 2729,1,
01208 2737,1,
01209 2740,1,
01210 2746,2,
01211 2758,1,
01212 2762,1,
01213 2766,2,
01214 2769,15,
01215 2788,2,
01216 2800,1,
01217 2802,15,
01218 2820,1,
01219 2829,2,
01220 2833,2,
01221 2857,1,
01222 2865,1,
01223 2868,1,
01224 2874,2,
01225 2884,3,
01226 2889,2,
01227 2894,8,
01228 2904,4,
01229 2910,1,
01230 2914,4,
01231 2930,16,
01232 2948,1,
01233 2955,3,
01234 2961,1,
01235 2966,3,
01236 2971,1,
01237 2973,1,
01238 2976,3,
01239 2981,3,
01240 2987,3,
01241 3002,4,
01242 3011,3,
01243 3017,1,
01244 3022,9,
01245 3032,14,
01246 3067,6,
01247 3076,1,
01248 3085,1,
01249 3089,1,
01250 3113,1,
01251 3124,1,
01252 3130,4,
01253 3141,1,
01254 3145,1,
01255 3150,7,
01256 3159,9,
01257 3170,4,
01258 3184,18,
01259 3204,1,
01260 3213,1,
01261 3217,1,
01262 3241,1,
01263 3252,1,
01264 3258,2,
01265 3269,1,
01266 3273,1,
01267 3278,7,
01268 3287,7,
01269 3295,1,
01270 3300,2,
01271 3312,1,
01272 3315,15,
01273 3332,1,
01274 3341,1,
01275 3345,1,
01276 3369,1,
01277 3386,4,
01278 3396,2,
01279 3401,1,
01280 3406,9,
01281 3416,8,
01282 3426,4,
01283 3440,18,
01284 3460,1,
01285 3479,3,
01286 3506,1,
01287 3516,1,
01288 3518,2,
01289 3527,3,
01290 3531,4,
01291 3541,1,
01292 3543,1,
01293 3552,18,
01294 3573,12,
01295 3643,4,
01296 3676,37,
01297 3715,1,
01298 3717,2,
01299 3721,1,
01300 3723,2,
01301 3726,6,
01302 3736,1,
01303 3744,1,
01304 3748,1,
01305 3750,1,
01306 3752,2,
01307 3756,1,
01308 3770,1,
01309 3774,2,
01310 3781,1,
01311 3783,1,
01312 3790,2,
01313 3802,2,
01314 3806,34,
01315 3912,1,
01316 3947,6,
01317 3980,4,
01318 3992,1,
01319 4029,1,
01320 4045,2,
01321 4050,46,
01322 4130,1,
01323 4136,1,
01324 4139,1,
01325 4147,3,
01326 4154,6,
01327 4186,70,
01328 4294,10,
01329 4349,3,
01330 4442,5,
01331 4515,5,
01332 4602,6,
01333 4681,1,
01334 4686,2,
01335 4695,1,
01336 4697,1,
01337 4702,2,
01338 4745,1,
01339 4750,2,
01340 4785,1,
01341 4790,2,
01342 4799,1,
01343 4801,1,
01344 4806,2,
01345 4823,1,
01346 4881,1,
01347 4886,2,
01348 4955,4,
01349 4989,3,
01350 5018,6,
01351 5109,12,
01352 5751,9,
01353 5789,3,
01354 5873,15,
01355 5901,1,
01356 5909,11,
01357 5943,9,
01358 5972,12,
01359 5997,1,
01360 6001,1,
01361 6004,12,
01362 6110,2,
01363 6122,6,
01364 6138,6,
01365 6159,1,
01366 6170,6,
01367 6264,8,
01368 6314,86,
01369 6429,3,
01370 6444,4,
01371 6460,4,
01372 6465,3,
01373 6510,2,
01374 6517,11,
01375 6570,6,
01376 6602,6,
01377 6618,4,
01378 6684,2,
01379 6688,224,
01380 6988,4,
01381 7037,387,
01382 7627,51,
01383 7836,4,
01384 7930,6,
01385 7958,2,
01386 7966,2,
01387 8006,2,
01388 8014,2,
01389 8024,1,
01390 8026,1,
01391 8028,1,
01392 8030,1,
01393 8062,2,
01394 8117,1,
01395 8133,1,
01396 8148,2,
01397 8156,1,
01398 8176,2,
01399 8181,1,
01400 8191,1,
01401 8292,6,
01402 8306,2,
01403 8335,1,
01404 8341,11,
01405 8374,26,
01406 8432,16,
01407 8527,4,
01408 8581,11,
01409 9192,24,
01410 9255,25,
01411 9291,21,
01412 9885,3,
01413 9907,78,
01414 9989,1,
01415 9994,2,
01416 10024,1,
01417 10060,1,
01418 10062,1,
01419 10067,3,
01420 10071,1,
01421 10079,2,
01422 10133,3,
01423 10160,1,
01424 10175,1,
01425 10187,5,
01426 10220,4,
01427 11035,5,
01428 11044,220,
01429 11311,1,
01430 11359,1,
01431 11373,7,
01432 11384,8,
01433 11499,14,
01434 11558,10,
01435 11622,9,
01436 11632,16,
01437 11671,9,
01438 11687,1,
01439 11695,1,
01440 11703,1,
01441 11711,1,
01442 11719,1,
01443 11727,1,
01444 11735,1,
01445 11743,33,
01446 11800,4,
01447 11806,98,
01448 11930,1,
01449 12020,12,
01450 12246,26,
01451 12284,4,
01452 12352,1,
01453 12439,2,
01454 12544,5,
01455 12589,4,
01456 12687,1,
01457 12728,8,
01458 12752,32,
01459 12831,1,
01460 12868,12,
01461 13055,1,
01462 19894,10,
01463 40892,68,
01464 42125,3,
01465 42183,569,
01466 42779,5,
01467 42786,222,
01468 43052,20,
01469 43128,904,
01470 55204,92,
01471 64046,2,
01472 64107,5,
01473 64218,38,
01474 64263,12,
01475 64280,5,
01476 64311,1,
01477 64317,1,
01478 64319,1,
01479 64322,1,
01480 64325,1,
01481 64434,33,
01482 64832,16,
01483 64912,2,
01484 64968,40,
01485 65022,2,
01486 65050,6,
01487 65060,12,
01488 65107,1,
01489 65127,1,
01490 65132,4,
01491 65141,1,
01492 65277,2,
01493 65280,1,
01494 65471,3,
01495 65480,2,
01496 65488,2,
01497 65496,2,
01498 65501,3,
01499 65511,1,
01500 65519,10
01501 ];
01502 
01503 letterCharacterSet = [
01504 65,26,
01505 97,26,
01506 170,1,
01507 181,1,
01508 186,1,
01509 192,23,
01510 216,31,
01511 248,458,
01512 710,12,
01513 736,5,
01514 750,1,
01515 768,112,
01516 890,4,
01517 902,1,
01518 904,3,
01519 908,1,
01520 910,20,
01521 931,44,
01522 976,38,
01523 1015,139,
01524 1155,4,
01525 1160,140,
01526 1329,38,
01527 1369,1,
01528 1377,39,
01529 1425,45,
01530 1471,1,
01531 1473,2,
01532 1476,2,
01533 1479,1,
01534 1488,27,
01535 1520,3,
01536 1552,6,
01537 1569,26,
01538 1600,31,
01539 1646,102,
01540 1749,8,
01541 1758,11,
01542 1770,6,
01543 1786,3,
01544 1791,1,
01545 1808,59,
01546 1869,33,
01547 1920,50,
01548 1994,44,
01549 2042,1,
01550 2305,57,
01551 2364,18,
01552 2384,5,
01553 2392,12,
01554 2427,5,
01555 2433,3,
01556 2437,8,
01557 2447,2,
01558 2451,22,
01559 2474,7,
01560 2482,1,
01561 2486,4,
01562 2492,9,
01563 2503,2,
01564 2507,4,
01565 2519,1,
01566 2524,2,
01567 2527,5,
01568 2544,2,
01569 2561,3,
01570 2565,6,
01571 2575,2,
01572 2579,22,
01573 2602,7,
01574 2610,2,
01575 2613,2,
01576 2616,2,
01577 2620,1,
01578 2622,5,
01579 2631,2,
01580 2635,3,
01581 2649,4,
01582 2654,1,
01583 2672,5,
01584 2689,3,
01585 2693,9,
01586 2703,3,
01587 2707,22,
01588 2730,7,
01589 2738,2,
01590 2741,5,
01591 2748,10,
01592 2759,3,
01593 2763,3,
01594 2768,1,
01595 2784,4,
01596 2817,3,
01597 2821,8,
01598 2831,2,
01599 2835,22,
01600 2858,7,
01601 2866,2,
01602 2869,5,
01603 2876,8,
01604 2887,2,
01605 2891,3,
01606 2902,2,
01607 2908,2,
01608 2911,3,
01609 2929,1,
01610 2946,2,
01611 2949,6,
01612 2958,3,
01613 2962,4,
01614 2969,2,
01615 2972,1,
01616 2974,2,
01617 2979,2,
01618 2984,3,
01619 2990,12,
01620 3006,5,
01621 3014,3,
01622 3018,4,
01623 3031,1,
01624 3073,3,
01625 3077,8,
01626 3086,3,
01627 3090,23,
01628 3114,10,
01629 3125,5,
01630 3134,7,
01631 3142,3,
01632 3146,4,
01633 3157,2,
01634 3168,2,
01635 3202,2,
01636 3205,8,
01637 3214,3,
01638 3218,23,
01639 3242,10,
01640 3253,5,
01641 3260,9,
01642 3270,3,
01643 3274,4,
01644 3285,2,
01645 3294,1,
01646 3296,4,
01647 3330,2,
01648 3333,8,
01649 3342,3,
01650 3346,23,
01651 3370,16,
01652 3390,6,
01653 3398,3,
01654 3402,4,
01655 3415,1,
01656 3424,2,
01657 3458,2,
01658 3461,18,
01659 3482,24,
01660 3507,9,
01661 3517,1,
01662 3520,7,
01663 3530,1,
01664 3535,6,
01665 3542,1,
01666 3544,8,
01667 3570,2,
01668 3585,58,
01669 3648,15,
01670 3713,2,
01671 3716,1,
01672 3719,2,
01673 3722,1,
01674 3725,1,
01675 3732,4,
01676 3737,7,
01677 3745,3,
01678 3749,1,
01679 3751,1,
01680 3754,2,
01681 3757,13,
01682 3771,3,
01683 3776,5,
01684 3782,1,
01685 3784,6,
01686 3804,2,
01687 3840,1,
01688 3864,2,
01689 3893,1,
01690 3895,1,
01691 3897,1,
01692 3902,10,
01693 3913,34,
01694 3953,20,
01695 3974,6,
01696 3984,8,
01697 3993,36,
01698 4038,1,
01699 4096,34,
01700 4131,5,
01701 4137,2,
01702 4140,7,
01703 4150,4,
01704 4176,10,
01705 4256,38,
01706 4304,43,
01707 4348,1,
01708 4352,90,
01709 4447,68,
01710 4520,82,
01711 4608,73,
01712 4682,4,
01713 4688,7,
01714 4696,1,
01715 4698,4,
01716 4704,41,
01717 4746,4,
01718 4752,33,
01719 4786,4,
01720 4792,7,
01721 4800,1,
01722 4802,4,
01723 4808,15,
01724 4824,57,
01725 4882,4,
01726 4888,67,
01727 4959,1,
01728 4992,16,
01729 5024,85,
01730 5121,620,
01731 5743,8,
01732 5761,26,
01733 5792,75,
01734 5888,13,
01735 5902,7,
01736 5920,21,
01737 5952,20,
01738 5984,13,
01739 5998,3,
01740 6002,2,
01741 6016,52,
01742 6070,30,
01743 6103,1,
01744 6108,2,
01745 6155,3,
01746 6176,88,
01747 6272,42,
01748 6400,29,
01749 6432,12,
01750 6448,12,
01751 6480,30,
01752 6512,5,
01753 6528,42,
01754 6576,26,
01755 6656,28,
01756 6912,76,
01757 7019,9,
01758 7424,203,
01759 7678,158,
01760 7840,90,
01761 7936,22,
01762 7960,6,
01763 7968,38,
01764 8008,6,
01765 8016,8,
01766 8025,1,
01767 8027,1,
01768 8029,1,
01769 8031,31,
01770 8064,53,
01771 8118,7,
01772 8126,1,
01773 8130,3,
01774 8134,7,
01775 8144,4,
01776 8150,6,
01777 8160,13,
01778 8178,3,
01779 8182,7,
01780 8305,1,
01781 8319,1,
01782 8336,5,
01783 8400,32,
01784 8450,1,
01785 8455,1,
01786 8458,10,
01787 8469,1,
01788 8473,5,
01789 8484,1,
01790 8486,1,
01791 8488,1,
01792 8490,4,
01793 8495,11,
01794 8508,4,
01795 8517,5,
01796 8526,1,
01797 8579,2,
01798 11264,47,
01799 11312,47,
01800 11360,13,
01801 11380,4,
01802 11392,101,
01803 11520,38,
01804 11568,54,
01805 11631,1,
01806 11648,23,
01807 11680,7,
01808 11688,7,
01809 11696,7,
01810 11704,7,
01811 11712,7,
01812 11720,7,
01813 11728,7,
01814 11736,7,
01815 12293,2,
01816 12330,6,
01817 12337,5,
01818 12347,2,
01819 12353,86,
01820 12441,2,
01821 12445,3,
01822 12449,90,
01823 12540,4,
01824 12549,40,
01825 12593,94,
01826 12704,24,
01827 12784,16,
01828 13312,6582,
01829 19968,20924,
01830 40960,1165,
01831 42775,4,
01832 43008,40,
01833 43072,52,
01834 44032,11172,
01835 63744,302,
01836 64048,59,
01837 64112,106,
01838 64256,7,
01839 64275,5,
01840 64285,12,
01841 64298,13,
01842 64312,5,
01843 64318,1,
01844 64320,2,
01845 64323,2,
01846 64326,108,
01847 64467,363,
01848 64848,64,
01849 64914,54,
01850 65008,12,
01851 65024,16,
01852 65056,4,
01853 65136,5,
01854 65142,135,
01855 65313,26,
01856 65345,26,
01857 65382,89,
01858 65474,6,
01859 65482,6,
01860 65490,6
01861 ];
01862 
01863 lowercaseLetterCharacterSet = [
01864 97,26,
01865 170,1,
01866 181,1,
01867 186,1,
01868 223,24,
01869 248,8,
01870 257,1,
01871 259,1,
01872 261,1,
01873 263,1,
01874 265,1,
01875 267,1,
01876 269,1,
01877 271,1,
01878 273,1,
01879 275,1,
01880 277,1,
01881 279,1,
01882 281,1,
01883 283,1,
01884 285,1,
01885 287,1,
01886 289,1,
01887 291,1,
01888 293,1,
01889 295,1,
01890 297,1,
01891 299,1,
01892 301,1,
01893 303,1,
01894 305,1,
01895 307,1,
01896 309,1,
01897 311,2,
01898 314,1,
01899 316,1,
01900 318,1,
01901 320,1,
01902 322,1,
01903 324,1,
01904 326,1,
01905 328,2,
01906 331,1,
01907 333,1,
01908 335,1,
01909 337,1,
01910 339,1,
01911 341,1,
01912 343,1,
01913 345,1,
01914 347,1,
01915 349,1,
01916 351,1,
01917 353,1,
01918 355,1,
01919 357,1,
01920 359,1,
01921 361,1,
01922 363,1,
01923 365,1,
01924 367,1,
01925 369,1,
01926 371,1,
01927 373,1,
01928 375,1,
01929 378,1,
01930 380,1,
01931 382,3,
01932 387,1,
01933 389,1,
01934 392,1,
01935 396,2,
01936 402,1,
01937 405,1,
01938 409,3,
01939 414,1,
01940 417,1,
01941 419,1,
01942 421,1,
01943 424,1,
01944 426,2,
01945 429,1,
01946 432,1,
01947 436,1,
01948 438,1,
01949 441,2,
01950 445,3,
01951 454,1,
01952 457,1,
01953 460,1,
01954 462,1,
01955 464,1,
01956 466,1,
01957 468,1,
01958 470,1,
01959 472,1,
01960 474,1,
01961 476,2,
01962 479,1,
01963 481,1,
01964 483,1,
01965 485,1,
01966 487,1,
01967 489,1,
01968 491,1,
01969 493,1,
01970 495,2,
01971 499,1,
01972 501,1,
01973 505,1,
01974 507,1,
01975 509,1,
01976 511,1,
01977 513,1,
01978 515,1,
01979 517,1,
01980 519,1,
01981 521,1,
01982 523,1,
01983 525,1,
01984 527,1,
01985 529,1,
01986 531,1,
01987 533,1,
01988 535,1,
01989 537,1,
01990 539,1,
01991 541,1,
01992 543,1,
01993 545,1,
01994 547,1,
01995 549,1,
01996 551,1,
01997 553,1,
01998 555,1,
01999 557,1,
02000 559,1,
02001 561,1,
02002 563,7,
02003 572,1,
02004 575,2,
02005 578,1,
02006 583,1,
02007 585,1,
02008 587,1,
02009 589,1,
02010 591,69,
02011 661,27,
02012 891,3,
02013 912,1,
02014 940,35,
02015 976,2,
02016 981,3,
02017 985,1,
02018 987,1,
02019 989,1,
02020 991,1,
02021 993,1,
02022 995,1,
02023 997,1,
02024 999,1,
02025 1001,1,
02026 1003,1,
02027 1005,1,
02028 1007,5,
02029 1013,1,
02030 1016,1,
02031 1019,2,
02032 1072,48,
02033 1121,1,
02034 1123,1,
02035 1125,1,
02036 1127,1,
02037 1129,1,
02038 1131,1,
02039 1133,1,
02040 1135,1,
02041 1137,1,
02042 1139,1,
02043 1141,1,
02044 1143,1,
02045 1145,1,
02046 1147,1,
02047 1149,1,
02048 1151,1,
02049 1153,1,
02050 1163,1,
02051 1165,1,
02052 1167,1,
02053 1169,1,
02054 1171,1,
02055 1173,1,
02056 1175,1,
02057 1177,1,
02058 1179,1,
02059 1181,1,
02060 1183,1,
02061 1185,1,
02062 1187,1,
02063 1189,1,
02064 1191,1,
02065 1193,1,
02066 1195,1,
02067 1197,1,
02068 1199,1,
02069 1201,1,
02070 1203,1,
02071 1205,1,
02072 1207,1,
02073 1209,1,
02074 1211,1,
02075 1213,1,
02076 1215,1,
02077 1218,1,
02078 1220,1,
02079 1222,1,
02080 1224,1,
02081 1226,1,
02082 1228,1,
02083 1230,2,
02084 1233,1,
02085 1235,1,
02086 1237,1,
02087 1239,1,
02088 1241,1,
02089 1243,1,
02090 1245,1,
02091 1247,1,
02092 1249,1,
02093 1251,1,
02094 1253,1,
02095 1255,1,
02096 1257,1,
02097 1259,1,
02098 1261,1,
02099 1263,1,
02100 1265,1,
02101 1267,1,
02102 1269,1,
02103 1271,1,
02104 1273,1,
02105 1275,1,
02106 1277,1,
02107 1279,1,
02108 1281,1,
02109 1283,1,
02110 1285,1,
02111 1287,1,
02112 1289,1,
02113 1291,1,
02114 1293,1,
02115 1295,1,
02116 1297,1,
02117 1299,1,
02118 1377,39,
02119 7424,44,
02120 7522,22,
02121 7545,34,
02122 7681,1,
02123 7683,1,
02124 7685,1,
02125 7687,1,
02126 7689,1,
02127 7691,1,
02128 7693,1,
02129 7695,1,
02130 7697,1,
02131 7699,1,
02132 7701,1,
02133 7703,1,
02134 7705,1,
02135 7707,1,
02136 7709,1,
02137 7711,1,
02138 7713,1,
02139 7715,1,
02140 7717,1,
02141 7719,1,
02142 7721,1,
02143 7723,1,
02144 7725,1,
02145 7727,1,
02146 7729,1,
02147 7731,1,
02148 7733,1,
02149 7735,1,
02150 7737,1,
02151 7739,1,
02152 7741,1,
02153 7743,1,
02154 7745,1,
02155 7747,1,
02156 7749,1,
02157 7751,1,
02158 7753,1,
02159 7755,1,
02160 7757,1,
02161 7759,1,
02162 7761,1,
02163 7763,1,
02164 7765,1,
02165 7767,1,
02166 7769,1,
02167 7771,1,
02168 7773,1,
02169 7775,1,
02170 7777,1,
02171 7779,1,
02172 7781,1,
02173 7783,1,
02174 7785,1,
02175 7787,1,
02176 7789,1,
02177 7791,1,
02178 7793,1,
02179 7795,1,
02180 7797,1,
02181 7799,1,
02182 7801,1,
02183 7803,1,
02184 7805,1,
02185 7807,1,
02186 7809,1,
02187 7811,1,
02188 7813,1,
02189 7815,1,
02190 7817,1,
02191 7819,1,
02192 7821,1,
02193 7823,1,
02194 7825,1,
02195 7827,1,
02196 7829,7,
02197 7841,1,
02198 7843,1,
02199 7845,1,
02200 7847,1,
02201 7849,1,
02202 7851,1,
02203 7853,1,
02204 7855,1,
02205 7857,1,
02206 7859,1,
02207 7861,1,
02208 7863,1,
02209 7865,1,
02210 7867,1,
02211 7869,1,
02212 7871,1,
02213 7873,1,
02214 7875,1,
02215 7877,1,
02216 7879,1,
02217 7881,1,
02218 7883,1,
02219 7885,1,
02220 7887,1,
02221 7889,1,
02222 7891,1,
02223 7893,1,
02224 7895,1,
02225 7897,1,
02226 7899,1,
02227 7901,1,
02228 7903,1,
02229 7905,1,
02230 7907,1,
02231 7909,1,
02232 7911,1,
02233 7913,1,
02234 7915,1,
02235 7917,1,
02236 7919,1,
02237 7921,1,
02238 7923,1,
02239 7925,1,
02240 7927,1,
02241 7929,1,
02242 7936,8,
02243 7952,6,
02244 7968,8,
02245 7984,8,
02246 8000,6,
02247 8016,8,
02248 8032,8,
02249 8048,14,
02250 8064,8,
02251 8080,8,
02252 8096,8,
02253 8112,5,
02254 8118,2,
02255 8126,1,
02256 8130,3,
02257 8134,2,
02258 8144,4,
02259 8150,2,
02260 8160,8,
02261 8178,3,
02262 8182,2,
02263 8305,1,
02264 8319,1,
02265 8458,1,
02266 8462,2,
02267 8467,1,
02268 8495,1,
02269 8500,1,
02270 8505,1,
02271 8508,2,
02272 8518,4,
02273 8526,1,
02274 8580,1,
02275 11312,47,
02276 11361,1,
02277 11365,2,
02278 11368,1,
02279 11370,1,
02280 11372,1,
02281 11380,1,
02282 11382,2,
02283 11393,1,
02284 11395,1,
02285 11397,1,
02286 11399,1,
02287 11401,1,
02288 11403,1,
02289 11405,1,
02290 11407,1,
02291 11409,1,
02292 11411,1,
02293 11413,1,
02294 11415,1,
02295 11417,1,
02296 11419,1,
02297 11421,1,
02298 11423,1,
02299 11425,1,
02300 11427,1,
02301 11429,1,
02302 11431,1,
02303 11433,1,
02304 11435,1,
02305 11437,1,
02306 11439,1,
02307 11441,1,
02308 11443,1,
02309 11445,1,
02310 11447,1,
02311 11449,1,
02312 11451,1,
02313 11453,1,
02314 11455,1,
02315 11457,1,
02316 11459,1,
02317 11461,1,
02318 11463,1,
02319 11465,1,
02320 11467,1,
02321 11469,1,
02322 11471,1,
02323 11473,1,
02324 11475,1,
02325 11477,1,
02326 11479,1,
02327 11481,1,
02328 11483,1,
02329 11485,1,
02330 11487,1,
02331 11489,1,
02332 11491,2,
02333 11520,38,
02334 64256,7,
02335 64275,5
02336 ];
02337 
02338 nonBaseCharacterSet = [
02339 768,112,
02340 1155,4,
02341 1160,2,
02342 1425,45,
02343 1471,1,
02344 1473,2,
02345 1476,2,
02346 1479,1,
02347 1552,6,
02348 1611,20,
02349 1648,1,
02350 1750,7,
02351 1758,7,
02352 1767,2,
02353 1770,4,
02354 1809,1,
02355 1840,27,
02356 1958,11,
02357 2027,9,
02358 2305,3,
02359 2364,1,
02360 2366,16,
02361 2385,4,
02362 2402,2,
02363 2433,3,
02364 2492,1,
02365 2494,7,
02366 2503,2,
02367 2507,3,
02368 2519,1,
02369 2530,2,
02370 2561,3,
02371 2620,1,
02372 2622,5,
02373 2631,2,
02374 2635,3,
02375 2672,2,
02376 2689,3,
02377 2748,1,
02378 2750,8,
02379 2759,3,
02380 2763,3,
02381 2786,2,
02382 2817,3,
02383 2876,1,
02384 2878,6,
02385 2887,2,
02386 2891,3,
02387 2902,2,
02388 2946,1,
02389 3006,5,
02390 3014,3,
02391 3018,4,
02392 3031,1,
02393 3073,3,
02394 3134,7,
02395 3142,3,
02396 3146,4,
02397 3157,2,
02398 3202,2,
02399 3260,1,
02400 3262,7,
02401 3270,3,
02402 3274,4,
02403 3285,2,
02404 3298,2,
02405 3330,2,
02406 3390,6,
02407 3398,3,
02408 3402,4,
02409 3415,1,
02410 3458,2,
02411 3530,1,
02412 3535,6,
02413 3542,1,
02414 3544,8,
02415 3570,2,
02416 3633,1,
02417 3636,7,
02418 3655,8,
02419 3761,1,
02420 3764,6,
02421 3771,2,
02422 3784,6,
02423 3864,2,
02424 3893,1,
02425 3895,1,
02426 3897,1,
02427 3902,2,
02428 3953,20,
02429 3974,2,
02430 3984,8,
02431 3993,36,
02432 4038,1,
02433 4140,7,
02434 4150,4,
02435 4182,4,
02436 4959,1,
02437 5906,3,
02438 5938,3,
02439 5970,2,
02440 6002,2,
02441 6070,30,
02442 6109,1,
02443 6155,3,
02444 6313,1,
02445 6432,12,
02446 6448,12,
02447 6576,17,
02448 6600,2,
02449 6679,5,
02450 6912,5,
02451 6964,17,
02452 7019,9,
02453 7616,11,
02454 7678,2,
02455 8400,32,
02456 12330,6,
02457 12441,2,
02458 43010,1,
02459 43014,1,
02460 43019,1,
02461 43043,5,
02462 64286,1,
02463 65024,16
02464 ];
02465 
02466 punctuationCharacterSet = [
02467 33,3,
02468 37,6,
02469 44,4,
02470 58,2,
02471 63,2,
02472 91,3,
02473 95,1,
02474 123,1,
02475 125,1,
02476 161,1,
02477 171,1,
02478 183,1,
02479 187,1,
02480 191,1,
02481 894,1,
02482 903,1,
02483 1370,6,
02484 1417,2,
02485 1470,1,
02486 1472,1,
02487 1475,1,
02488 1478,1,
02489 1523,2,
02490 1548,2,
02491 1563,1,
02492 1566,2,
02493 1642,4,
02494 1748,1,
02495 1792,14,
02496 2039,3,
02497 2404,2,
02498 2416,1,
02499 3572,1,
02500 3663,1,
02501 3674,2,
02502 3844,15,
02503 3898,4,
02504 3973,1,
02505 4048,2,
02506 4170,6,
02507 4347,1,
02508 4961,8,
02509 5741,2,
02510 5787,2,
02511 5867,3,
02512 5941,2,
02513 6100,3,
02514 6104,3,
02515 6144,11,
02516 6468,2,
02517 6622,2,
02518 6686,2,
02519 7002,7,
02520 8208,24,
02521 8240,20,
02522 8261,13,
02523 8275,12,
02524 8317,2,
02525 8333,2,
02526 9001,2,
02527 10088,14,
02528 10181,2,
02529 10214,6,
02530 10627,22,
02531 10712,4,
02532 10748,2,
02533 11513,4,
02534 11518,2,
02535 11776,24,
02536 11804,2,
02537 12289,3,
02538 12296,10,
02539 12308,12,
02540 12336,1,
02541 12349,1,
02542 12448,1,
02543 12539,1,
02544 43124,4,
02545 64830,2,
02546 65040,10,
02547 65072,35,
02548 65108,14,
02549 65123,1,
02550 65128,1,
02551 65130,2,
02552 65281,3,
02553 65285,6,
02554 65292,4,
02555 65306,2,
02556 65311,2,
02557 65339,3,
02558 65343,1,
02559 65371,1,
02560 65373,1
02561 ];
02562 
02563 uppercaseLetterCharacterSet = [
02564 65,26,
02565 192,23,
02566 216,7,
02567 256,1,
02568 258,1,
02569 260,1,
02570 262,1,
02571 264,1,
02572 266,1,
02573 268,1,
02574 270,1,
02575 272,1,
02576 274,1,
02577 276,1,
02578 278,1,
02579 280,1,
02580 282,1,
02581 284,1,
02582 286,1,
02583 288,1,
02584 290,1,
02585 292,1,
02586 294,1,
02587 296,1,
02588 298,1,
02589 300,1,
02590 302,1,
02591 304,1,
02592 306,1,
02593 308,1,
02594 310,1,
02595 313,1,
02596 315,1,
02597 317,1,
02598 319,1,
02599 321,1,
02600 323,1,
02601 325,1,
02602 327,1,
02603 330,1,
02604 332,1,
02605 334,1,
02606 336,1,
02607 338,1,
02608 340,1,
02609 342,1,
02610 344,1,
02611 346,1,
02612 348,1,
02613 350,1,
02614 352,1,
02615 354,1,
02616 356,1,
02617 358,1,
02618 360,1,
02619 362,1,
02620 364,1,
02621 366,1,
02622 368,1,
02623 370,1,
02624 372,1,
02625 374,1,
02626 376,2,
02627 379,1,
02628 381,1,
02629 385,2,
02630 388,1,
02631 390,2,
02632 393,3,
02633 398,4,
02634 403,2,
02635 406,3,
02636 412,2,
02637 415,2,
02638 418,1,
02639 420,1,
02640 422,2,
02641 425,1,
02642 428,1,
02643 430,2,
02644 433,3,
02645 437,1,
02646 439,2,
02647 444,1,
02648 452,2,
02649 455,2,
02650 458,2,
02651 461,1,
02652 463,1,
02653 465,1,
02654 467,1,
02655 469,1,
02656 471,1,
02657 473,1,
02658 475,1,
02659 478,1,
02660 480,1,
02661 482,1,
02662 484,1,
02663 486,1,
02664 488,1,
02665 490,1,
02666 492,1,
02667 494,1,
02668 497,2,
02669 500,1,
02670 502,3,
02671 506,1,
02672 508,1,
02673 510,1,
02674 512,1,
02675 514,1,
02676 516,1,
02677 518,1,
02678 520,1,
02679 522,1,
02680 524,1,
02681 526,1,
02682 528,1,
02683 530,1,
02684 532,1,
02685 534,1,
02686 536,1,
02687 538,1,
02688 540,1,
02689 542,1,
02690 544,1,
02691 546,1,
02692 548,1,
02693 550,1,
02694 552,1,
02695 554,1,
02696 556,1,
02697 558,1,
02698 560,1,
02699 562,1,
02700 570,2,
02701 573,2,
02702 577,1,
02703 579,4,
02704 584,1,
02705 586,1,
02706 588,1,
02707 590,1,
02708 902,1,
02709 904,3,
02710 908,1,
02711 910,2,
02712 913,17,
02713 931,9,
02714 978,3,
02715 984,1,
02716 986,1,
02717 988,1,
02718 990,1,
02719 992,1,
02720 994,1,
02721 996,1,
02722 998,1,
02723 1000,1,
02724 1002,1,
02725 1004,1,
02726 1006,1,
02727 1012,1,
02728 1015,1,
02729 1017,2,
02730 1021,51,
02731 1120,1,
02732 1122,1,
02733 1124,1,
02734 1126,1,
02735 1128,1,
02736 1130,1,
02737 1132,1,
02738 1134,1,
02739 1136,1,
02740 1138,1,
02741 1140,1,
02742 1142,1,
02743 1144,1,
02744 1146,1,
02745 1148,1,
02746 1150,1,
02747 1152,1,
02748 1162,1,
02749 1164,1,
02750 1166,1,
02751 1168,1,
02752 1170,1,
02753 1172,1,
02754 1174,1,
02755 1176,1,
02756 1178,1,
02757 1180,1,
02758 1182,1,
02759 1184,1,
02760 1186,1,
02761 1188,1,
02762 1190,1,
02763 1192,1,
02764 1194,1,
02765 1196,1,
02766 1198,1,
02767 1200,1,
02768 1202,1,
02769 1204,1,
02770 1206,1,
02771 1208,1,
02772 1210,1,
02773 1212,1,
02774 1214,1,
02775 1216,2,
02776 1219,1,
02777 1221,1,
02778 1223,1,
02779 1225,1,
02780 1227,1,
02781 1229,1,
02782 1232,1,
02783 1234,1,
02784 1236,1,
02785 1238,1,
02786 1240,1,
02787 1242,1,
02788 1244,1,
02789 1246,1,
02790 1248,1,
02791 1250,1,
02792 1252,1,
02793 1254,1,
02794 1256,1,
02795 1258,1,
02796 1260,1,
02797 1262,1,
02798 1264,1,
02799 1266,1,
02800 1268,1,
02801 1270,1,
02802 1272,1,
02803 1274,1,
02804 1276,1,
02805 1278,1,
02806 1280,1,
02807 1282,1,
02808 1284,1,
02809 1286,1,
02810 1288,1,
02811 1290,1,
02812 1292,1,
02813 1294,1,
02814 1296,1,
02815 1298,1,
02816 1329,38,
02817 4256,38,
02818 7680,1,
02819 7682,1,
02820 7684,1,
02821 7686,1,
02822 7688,1,
02823 7690,1,
02824 7692,1,
02825 7694,1,
02826 7696,1,
02827 7698,1,
02828 7700,1,
02829 7702,1,
02830 7704,1,
02831 7706,1,
02832 7708,1,
02833 7710,1,
02834 7712,1,
02835 7714,1,
02836 7716,1,
02837 7718,1,
02838 7720,1,
02839 7722,1,
02840 7724,1,
02841 7726,1,
02842 7728,1,
02843 7730,1,
02844 7732,1,
02845 7734,1,
02846 7736,1,
02847 7738,1,
02848 7740,1,
02849 7742,1,
02850 7744,1,
02851 7746,1,
02852 7748,1,
02853 7750,1,
02854 7752,1,
02855 7754,1,
02856 7756,1,
02857 7758,1,
02858 7760,1,
02859 7762,1,
02860 7764,1,
02861 7766,1,
02862 7768,1,
02863 7770,1,
02864 7772,1,
02865 7774,1,
02866 7776,1,
02867 7778,1,
02868 7780,1,
02869 7782,1,
02870 7784,1,
02871 7786,1,
02872 7788,1,
02873 7790,1,
02874 7792,1,
02875 7794,1,
02876 7796,1,
02877 7798,1,
02878 7800,1,
02879 7802,1,
02880 7804,1,
02881 7806,1,
02882 7808,1,
02883 7810,1,
02884 7812,1,
02885 7814,1,
02886 7816,1,
02887 7818,1,
02888 7820,1,
02889 7822,1,
02890 7824,1,
02891 7826,1,
02892 7828,1,
02893 7840,1,
02894 7842,1,
02895 7844,1,
02896 7846,1,
02897 7848,1,
02898 7850,1,
02899 7852,1,
02900 7854,1,
02901 7856,1,
02902 7858,1,
02903 7860,1,
02904 7862,1,
02905 7864,1,
02906 7866,1,
02907 7868,1,
02908 7870,1,
02909 7872,1,
02910 7874,1,
02911 7876,1,
02912 7878,1,
02913 7880,1,
02914 7882,1,
02915 7884,1,
02916 7886,1,
02917 7888,1,
02918 7890,1,
02919 7892,1,
02920 7894,1,
02921 7896,1,
02922 7898,1,
02923 7900,1,
02924 7902,1,
02925 7904,1,
02926 7906,1,
02927 7908,1,
02928 7910,1,
02929 7912,1,
02930 7914,1,
02931 7916,1,
02932 7918,1,
02933 7920,1,
02934 7922,1,
02935 7924,1,
02936 7926,1,
02937 7928,1,
02938 7944,8,
02939 7960,6,
02940 7976,8,
02941 7992,8,
02942 8008,6,
02943 8025,1,
02944 8027,1,
02945 8029,1,
02946 8031,1,
02947 8040,8,
02948 8072,8,
02949 8088,8,
02950 8104,8,
02951 8120,5,
02952 8136,5,
02953 8152,4,
02954 8168,5,
02955 8184,5,
02956 8450,1,
02957 8455,1,
02958 8459,3,
02959 8464,3,
02960 8469,1,
02961 8473,5,
02962 8484,1,
02963 8486,1,
02964 8488,1,
02965 8490,4,
02966 8496,4,
02967 8510,2,
02968 8517,1,
02969 8579,1,
02970 11264,47,
02971 11360,1,
02972 11362,3,
02973 11367,1,
02974 11369,1,
02975 11371,1,
02976 11381,1,
02977 11392,1,
02978 11394,1,
02979 11396,1,
02980 11398,1,
02981 11400,1,
02982 11402,1,
02983 11404,1,
02984 11406,1,
02985 11408,1,
02986 11410,1,
02987 11412,1,
02988 11414,1,
02989 11416,1,
02990 11418,1,
02991 11420,1,
02992 11422,1,
02993 11424,1,
02994 11426,1,
02995 11428,1,
02996 11430,1,
02997 11432,1,
02998 11434,1,
02999 11436,1,
03000 11438,1,
03001 11440,1,
03002 11442,1,
03003 11444,1,
03004 11446,1,
03005 11448,1,
03006 11450,1,
03007 11452,1,
03008 11454,1,
03009 11456,1,
03010 11458,1,
03011 11460,1,
03012 11462,1,
03013 11464,1,
03014 11466,1,
03015 11468,1,
03016 11470,1,
03017 11472,1,
03018 11474,1,
03019 11476,1,
03020 11478,1,
03021 11480,1,
03022 11482,1,
03023 11484,1,
03024 11486,1,
03025 11488,1,
03026 11490,1
03027 ];
03028 
03029 whitespaceAndNewlineCharacterSet = [
03030 9,5,
03031 32,1,
03032 133,1,
03033 160,1,
03034 5760,1,
03035 8192,12,
03036 8232,2,
03037 8239,1,
03038 8287,1
03039 ];
03040 
03041 whitespaceCharacterSet = [
03042 9,1,
03043 32,1,
03044 160,1,
03045 5760,1,
03046 8192,12,
03047 8239,1,
03048 8287,1
03049 ];
 All Classes Files Functions Variables Defines