cStrings.pas 1.2 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993
  1. {******************************************************************************}
  2. { }
  3. { Library: Fundamentals 4.00 }
  4. { File name: cStrings.pas }
  5. { File version: 4.57 }
  6. { Description: String utility functions }
  7. { }
  8. { Copyright: Copyright (c) 1999-2013, David J Butler }
  9. { All rights reserved. }
  10. { Redistribution and use in source and binary forms, with }
  11. { or without modification, are permitted provided that }
  12. { the following conditions are met: }
  13. { Redistributions of source code must retain the above }
  14. { copyright notice, this list of conditions and the }
  15. { following disclaimer. }
  16. { THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND }
  17. { CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED }
  18. { WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED }
  19. { WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A }
  20. { PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL }
  21. { THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, }
  22. { INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR }
  23. { CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, }
  24. { PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF }
  25. { USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) }
  26. { HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER }
  27. { IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING }
  28. { NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE }
  29. { USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE }
  30. { POSSIBILITY OF SUCH DAMAGE. }
  31. { }
  32. { Home page: http://fundementals.sourceforge.net }
  33. { Forum: http://sourceforge.net/forum/forum.php?forum_id=2117 }
  34. { E-mail: fundamentalslib@gmail.com }
  35. { }
  36. { Revision history: }
  37. { }
  38. { 1999/10/19 0.01 Split from Maths unit. }
  39. { 1999/10/26 0.02 Revision. }
  40. { 1999/10/30 0.03 Added Count, Reverse. }
  41. { 1999/10/31 0.04 Improved Match. }
  42. { Added Replace, Count, PadInside. }
  43. { 1999/11/06 1.05 Added Remove, TrimEllipse. }
  44. { 1999/11/09 1.06 Added Pack functions. }
  45. { 1999/11/17 1.07 Added PosN, Before, After, Between and Split. }
  46. { 1999/11/22 1.08 Added Join. }
  47. { 1999/11/23 1.09 Added Translate. }
  48. { 1999/12/02 1.10 Fixed bugs in Replace and Match reported by daiqingbo. }
  49. { 1999/12/27 1.11 Added SelfTest procedure and Bug fixes. }
  50. { 2000/01/04 1.12 Added InsensitiveCharSet. }
  51. { 2000/01/08 1.13 Added Append. }
  52. { 2000/05/08 1.14 Revision. }
  53. { 2000/07/20 1.15 Bug fixes. }
  54. { 2000/08/30 1.16 Bug fixes. }
  55. { 2000/09/04 1.17 Added MatchFileMask. }
  56. { 2000/09/31 1.18 Added HexEscapeText and HexUnescapeText. }
  57. { 2000/12/04 1.19 Changes to CopyRange, CopyLeft to avoid memory }
  58. { allocation in specific cases. }
  59. { 2001/04/22 1.20 Added CaseSensitive parameter to Match, PosNext, PosN }
  60. { 2001/04/25 1.21 Added CopyEx, MatchLeft and MatchRight. }
  61. { 2001/04/28 1.22 Refactoring. }
  62. { Replaced PosNext and PosPrev with Pos. }
  63. { 2001/04/29 1.23 Improvements. }
  64. { 2001/05/13 1.24 Added simple regular expression matching. }
  65. { Added CharClassStr conversion routines. }
  66. { 2001/06/01 1.25 Added TQuickLexer }
  67. { 2001/07/07 1.26 Optimizations. }
  68. { 2001/07/30 1.27 Revision. }
  69. { 2001/08/22 1.28 Revision. }
  70. { 2001/11/11 2.29 Revision. }
  71. { 2002/02/14 2.30 Added MatchPattern. }
  72. { 2002/04/03 3.31 Added string functions from cUtils. }
  73. { 2002/04/14 3.32 Moved TQuickLexer to unit cQuickLexer. }
  74. { 2002/12/14 3.33 Major revision. Removed rarely used functions. }
  75. { 2003/07/28 3.34 Minor changes. }
  76. { 2003/08/04 3.35 Changed parameters of StrMatch functions to be }
  77. { consistent with other string functions. }
  78. { Changed StrCompare functions to return integer result. }
  79. { 2003/09/06 3.36 Removed dependancy on Delphi's Math and Variant units. }
  80. { This saves about 25K when used in a DLL. }
  81. { 2003/11/07 3.37 Compilable with FreePascal 1.90 Win32 i386. }
  82. { 2004/07/31 3.38 Improved StrReplace function to efficiently handle }
  83. { cases where millions of matches are found. }
  84. { 2004/08/01 3.39 Added ToLongWord conversion functions. }
  85. { 2005/06/10 4.40 Compilable with FreePascal 2 Win32 i386. }
  86. { 2005/09/20 4.41 Added TStringBuilder class. }
  87. { 2005/09/21 4.42 Revised for Fundamentals 4. }
  88. { 2007/06/08 4.43 Compilable with FreePascal 2.0.4 Win32 i386 }
  89. { 2008/08/18 4.44 StrP functions; added Str prefix to some functions. }
  90. { 2009/01/04 4.45 Added AsciiChar and AsciiString. }
  91. { Initial update for Delphi 2009. }
  92. { 2009/10/09 4.46 Compilable with Delphi 2009 Win32/.NET. }
  93. { 2010/06/27 4.47 Compilable with FreePascal 2.4.0 OSX x86-64 }
  94. { 2011/03/17 4.48 Compilable with Delphi 5. }
  95. { 2011/05/28 4.49 Fix in TWideStringBuilder. }
  96. { 2011/06/14 4.50 Added Append(BufPtr) method to TStringBuilder. }
  97. { 2011/09/30 4.51 Improved UnicodeString support. }
  98. { 2011/10/17 4.52 WideString functions. }
  99. { 2012/03/26 4.53 Add A and W string functions. }
  100. { 2012/08/24 4.54 Improvements to StrZ functions. }
  101. { 2012/08/25 4.55 Add U string functions. }
  102. { 2012/08/28 4.56 Add Unicode character functions from cUnicode. }
  103. { 2012/08/29 4.57 Improve pattern matcher functions. }
  104. { }
  105. { Supported compilers: }
  106. { }
  107. { Delphi 5 Win32 i386 4.48 2011/03/17 }
  108. { Delphi 6 Win32 i386 }
  109. { Delphi 7 Win32 i386 4.57 2012/08/30 }
  110. { Delphi 2005 Win32 i386 }
  111. { Delphi 2006 Win32 i386 }
  112. { Delphi 2007 Win32 i386 4.57 2012/08/29 }
  113. { Delphi 2009 Win32 i386 4.50 2011/09/27 }
  114. { Delphi 2009 .NET 4.46 2009/10/09 }
  115. { Delphi XE 4.57 2012/08/29 }
  116. { Delphi XE3 x86-64 4.57 2013/01/29 }
  117. { FreePascal 2.0.4 Linux i386 4.45 2009/06/06 }
  118. { FreePascal 2.4.0 OSX x86-64 4.47 2010/06/27 }
  119. { FreePascal 2.6.0 Win32 i386 4.57 2012/08/30 }
  120. { }
  121. { Notes: }
  122. { Unicode functions in this unit work from data in source code form. }
  123. { All tables were generated from the Unicode 3.2 data. }
  124. { }
  125. {******************************************************************************}
  126. {$INCLUDE cDefines.inc}
  127. {$IFDEF FREEPASCAL}
  128. {$WARNINGS OFF}
  129. {$HINTS OFF}
  130. {$ENDIF}
  131. {$IFDEF DEBUG}
  132. {$IFDEF SELFTEST}
  133. {$DEFINE STRINGS_SELFTEST}
  134. {$ENDIF}
  135. {$ENDIF}
  136. unit cStrings;
  137. interface
  138. uses
  139. { System }
  140. SysUtils,
  141. {$IFDEF CLR}
  142. Borland.Vcl.StrUtils,
  143. {$ENDIF}
  144. { Fundamentals }
  145. cUtils;
  146. { }
  147. { Exceptions }
  148. { }
  149. type
  150. EStringError = class(Exception);
  151. EStrInvalidArgument = class(EStringError);
  152. { }
  153. { AnsiString }
  154. { AnsiChar is a byte character. }
  155. { AnsiString is a reference counted, code page aware, byte string. }
  156. { }
  157. { }
  158. { WideString }
  159. { WideChar is a 16-bit character. }
  160. { WideString is not reference counted. }
  161. { }
  162. type
  163. {$IFNDEF SupportWideChar}
  164. WideChar = type Word;
  165. PWideChar = ^WideChar;
  166. {$ENDIF}
  167. TWideCharMatchFunction = function (const Ch: WideChar): Boolean;
  168. { }
  169. { UCS4String }
  170. { UCS4Char is a 32-bit character from the Unicode character set. }
  171. { UCS4String is a reference counted string of UCS4Char characters. }
  172. { }
  173. type
  174. {$IFNDEF SupportUCS4String}
  175. UCS4Char = type LongWord;
  176. PUCS4Char = ^UCS4Char;
  177. UCS4String = array of UCS4Char;
  178. {$ENDIF}
  179. UCS4StringArray = array of UCS4String;
  180. { }
  181. { UnicodeString }
  182. { UnicodeString in Delphi 2009 is reference counted, code page aware, }
  183. { variable character length unicode string. Defaults to UTF-16 encoding. }
  184. { }
  185. { }
  186. { AsciiString }
  187. { AsciiString is an alias for AnsiString where all bytes are from Ascii. }
  188. { }
  189. type
  190. AsciiChar = AnsiChar;
  191. PAsciiChar = ^AsciiChar;
  192. AsciiString = AnsiString;
  193. AsciiCharSet = set of AsciiChar;
  194. AsciiStringArray = array of AsciiString;
  195. { }
  196. { RawByteString }
  197. { RawByteString is an alias for AnsiString where all bytes are raw bytes }
  198. { that do not undergo any character set translation. }
  199. { Under Delphi 2009 RawByteString is defined as "type AnsiString($FFFF)". }
  200. { }
  201. type
  202. RawByteChar = AnsiChar;
  203. PRawByteChar = ^RawByteChar;
  204. {$IFNDEF SupportRawByteString}
  205. RawByteString = AnsiString;
  206. {$ENDIF}
  207. RawByteCharSet = set of RawByteChar;
  208. RawByteStringArray = array of RawByteString;
  209. { }
  210. { UTF8String }
  211. { UTF8String is a variable character length encoding for Unicode strings. }
  212. { For Ascii values, a UTF8String is the same as a AsciiString. }
  213. { Under Delphi 2009 UTF8String is defined as "type AnsiString($FDE9)" }
  214. { }
  215. type
  216. {$IFNDEF SupportUTF8String}
  217. UTF8Char = AnsiChar;
  218. PUTF8Char = ^UTF8Char;
  219. UTF8String = type AnsiString;
  220. {$ENDIF}
  221. UTF8StringArray = array of UTF8String;
  222. { }
  223. { Zero terminated string pointer }
  224. { }
  225. {$IFNDEF ManagedCode}
  226. type
  227. PStrZA = PAnsiChar;
  228. PStrZW = PWideChar;
  229. PStrZ = PChar;
  230. {$ENDIF}
  231. { }
  232. { ASCII constants }
  233. { }
  234. const
  235. AsciiNULL = AsciiChar(#0);
  236. AsciiSOH = AsciiChar(#1);
  237. AsciiSTX = AsciiChar(#2);
  238. AsciiETX = AsciiChar(#3);
  239. AsciiEOT = AsciiChar(#4);
  240. AsciiENQ = AsciiChar(#5);
  241. AsciiACK = AsciiChar(#6);
  242. AsciiBEL = AsciiChar(#7);
  243. AsciiBS = AsciiChar(#8);
  244. AsciiHT = AsciiChar(#9);
  245. AsciiLF = AsciiChar(#10);
  246. AsciiVT = AsciiChar(#11);
  247. AsciiFF = AsciiChar(#12);
  248. AsciiCR = AsciiChar(#13);
  249. AsciiSO = AsciiChar(#14);
  250. AsciiSI = AsciiChar(#15);
  251. AsciiDLE = AsciiChar(#16);
  252. AsciiDC1 = AsciiChar(#17);
  253. AsciiDC2 = AsciiChar(#18);
  254. AsciiDC3 = AsciiChar(#19);
  255. AsciiDC4 = AsciiChar(#20);
  256. AsciiNAK = AsciiChar(#21);
  257. AsciiSYN = AsciiChar(#22);
  258. AsciiETB = AsciiChar(#23);
  259. AsciiCAN = AsciiChar(#24);
  260. AsciiEM = AsciiChar(#25);
  261. AsciiEOF = AsciiChar(#26);
  262. AsciiESC = AsciiChar(#27);
  263. AsciiFS = AsciiChar(#28);
  264. AsciiGS = AsciiChar(#29);
  265. AsciiRS = AsciiChar(#30);
  266. AsciiUS = AsciiChar(#31);
  267. AsciiSP = AsciiChar(#32);
  268. AsciiDEL = AsciiChar(#127);
  269. AsciiXON = AsciiDC1;
  270. AsciiXOFF = AsciiDC3;
  271. AsciiCRLF = AsciiCR + AsciiLF;
  272. AsciiDecimalPoint = AsciiChar(#46);
  273. AsciiComma = AsciiChar(#44);
  274. AsciiBackSlash = AsciiChar(#92);
  275. AsciiForwardSlash = AsciiChar(#47);
  276. AsciiPercent = AsciiChar(#37);
  277. AsciiAmpersand = AsciiChar(#38);
  278. AsciiPlus = AsciiChar(#43);
  279. AsciiMinus = AsciiChar(#45);
  280. AsciiEqualSign = AsciiChar(#61);
  281. AsciiSingleQuote = AsciiChar(#39);
  282. AsciiDoubleQuote = AsciiChar(#34);
  283. AsciiDigit0 = AsciiChar(#48);
  284. AsciiDigit9 = AsciiChar(#57);
  285. AsciiUpperA = AsciiChar(#65);
  286. AsciiUpperZ = AsciiChar(#90);
  287. AsciiLowerA = AsciiChar(#97);
  288. AsciiLowerZ = AsciiChar(#122);
  289. AsciiLowCaseLookup: Array[AsciiChar] of AsciiChar = (
  290. #$00, #$01, #$02, #$03, #$04, #$05, #$06, #$07,
  291. #$08, #$09, #$0A, #$0B, #$0C, #$0D, #$0E, #$0F,
  292. #$10, #$11, #$12, #$13, #$14, #$15, #$16, #$17,
  293. #$18, #$19, #$1A, #$1B, #$1C, #$1D, #$1E, #$1F,
  294. #$20, #$21, #$22, #$23, #$24, #$25, #$26, #$27,
  295. #$28, #$29, #$2A, #$2B, #$2C, #$2D, #$2E, #$2F,
  296. #$30, #$31, #$32, #$33, #$34, #$35, #$36, #$37,
  297. #$38, #$39, #$3A, #$3B, #$3C, #$3D, #$3E, #$3F,
  298. #$40, #$61, #$62, #$63, #$64, #$65, #$66, #$67,
  299. #$68, #$69, #$6A, #$6B, #$6C, #$6D, #$6E, #$6F,
  300. #$70, #$71, #$72, #$73, #$74, #$75, #$76, #$77,
  301. #$78, #$79, #$7A, #$5B, #$5C, #$5D, #$5E, #$5F,
  302. #$60, #$61, #$62, #$63, #$64, #$65, #$66, #$67,
  303. #$68, #$69, #$6A, #$6B, #$6C, #$6D, #$6E, #$6F,
  304. #$70, #$71, #$72, #$73, #$74, #$75, #$76, #$77,
  305. #$78, #$79, #$7A, #$7B, #$7C, #$7D, #$7E, #$7F,
  306. #$80, #$81, #$82, #$83, #$84, #$85, #$86, #$87,
  307. #$88, #$89, #$8A, #$8B, #$8C, #$8D, #$8E, #$8F,
  308. #$90, #$91, #$92, #$93, #$94, #$95, #$96, #$97,
  309. #$98, #$99, #$9A, #$9B, #$9C, #$9D, #$9E, #$9F,
  310. #$A0, #$A1, #$A2, #$A3, #$A4, #$A5, #$A6, #$A7,
  311. #$A8, #$A9, #$AA, #$AB, #$AC, #$AD, #$AE, #$AF,
  312. #$B0, #$B1, #$B2, #$B3, #$B4, #$B5, #$B6, #$B7,
  313. #$B8, #$B9, #$BA, #$BB, #$BC, #$BD, #$BE, #$BF,
  314. #$C0, #$C1, #$C2, #$C3, #$C4, #$C5, #$C6, #$C7,
  315. #$C8, #$C9, #$CA, #$CB, #$CC, #$CD, #$CE, #$CF,
  316. #$D0, #$D1, #$D2, #$D3, #$D4, #$D5, #$D6, #$D7,
  317. #$D8, #$D9, #$DA, #$DB, #$DC, #$DD, #$DE, #$DF,
  318. #$E0, #$E1, #$E2, #$E3, #$E4, #$E5, #$E6, #$E7,
  319. #$E8, #$E9, #$EA, #$EB, #$EC, #$ED, #$EE, #$EF,
  320. #$F0, #$F1, #$F2, #$F3, #$F4, #$F5, #$F6, #$F7,
  321. #$F8, #$F9, #$FA, #$FB, #$FC, #$FD, #$FE, #$FF);
  322. { }
  323. { AnsiChar constants }
  324. { }
  325. const
  326. { Common characters }
  327. chTab = AsciiHT;
  328. chSpace = AsciiSP;
  329. chDecimalPoint = AnsiChar('.');
  330. chComma = AnsiChar(',');
  331. chBackSlash = AnsiChar('\');
  332. chForwardSlash = AnsiChar('/');
  333. chPercent = AnsiChar('%');
  334. chAmpersand = AnsiChar('&');
  335. chPlus = AnsiChar('+');
  336. chMinus = AnsiChar('-');
  337. chEqual = AnsiChar('=');
  338. chLessThan = AnsiChar('<');
  339. chGreaterThan = AnsiChar('>');
  340. chSingleQuote = AnsiChar('''');
  341. chDoubleQuote = AnsiChar('"');
  342. chExclamation = AnsiChar('!');
  343. chHash = AnsiChar('#');
  344. chDollar = AnsiChar('$');
  345. chCaret = AnsiChar('^');
  346. chAsterisk = AnsiChar('*');
  347. { Common sequences }
  348. CRLF = AsciiCR + AsciiLF;
  349. LFCR = AsciiLF + AsciiCR;
  350. DosNewLine = CRLF;
  351. UnixNewLine = AsciiLF;
  352. { Character sets }
  353. csComplete = [#0..#255];
  354. csAnsi = [#0..#255];
  355. csAscii = [#0..#127];
  356. csNotAscii = csComplete - csAscii;
  357. csAsciiCtl = [#0..#31];
  358. csAsciiText = [#32..#127];
  359. csAlphaLow = ['a'..'z'];
  360. csAlphaUp = ['A'..'Z'];
  361. csAlpha = csAlphaLow + csAlphaUp;
  362. csNotAlpha = csComplete - csAlpha;
  363. csNumeric = ['0'..'9'];
  364. csNotNumeric = csComplete - csNumeric;
  365. csAlphaNumeric = csNumeric + csAlpha;
  366. csNotAlphaNumeric = csComplete - csAlphaNumeric;
  367. csWhiteSpace = csAsciiCtl + [AsciiSP];
  368. csSign = [chPlus, chMinus];
  369. csExponent = ['E', 'e'];
  370. csBinaryDigit = ['0'..'1'];
  371. csOctalDigit = ['0'..'7'];
  372. csHexDigitLow = csNumeric + ['a'..'f'];
  373. csHexDigitUp = csNumeric + ['A'..'F'];
  374. csHexDigit = csNumeric + ['A'..'F', 'a'..'f'];
  375. csQuotes = [chSingleQuote, chDoubleQuote];
  376. csParentheses = ['(', ')'];
  377. csCurlyBrackets = ['{', '}'];
  378. csBlockBrackets = ['[', ']'];
  379. csPunctuation = ['.', ',', ':', '/', '?', '<', '>', ';', '"', '''',
  380. '[', ']', '{', '}', '+', '=', '-', '\', '(', ')',
  381. '*', '&', '^', '%', '$', '#', '@', '!', '`', '~'];
  382. csSlash = [chBackSlash, chForwardSlash];
  383. { }
  384. { WideChar constants }
  385. { }
  386. const
  387. WideNULL = WideChar(#0);
  388. WideSOH = WideChar(#1);
  389. WideSTX = WideChar(#2);
  390. WideETX = WideChar(#3);
  391. WideEOT = WideChar(#4);
  392. WideENQ = WideChar(#5);
  393. WideACK = WideChar(#6);
  394. WideBEL = WideChar(#7);
  395. WideBS = WideChar(#8);
  396. WideHT = WideChar(#9);
  397. WideLF = WideChar(#10);
  398. WideVT = WideChar(#11);
  399. WideFF = WideChar(#12);
  400. WideCR = WideChar(#13);
  401. WideSO = WideChar(#14);
  402. WideSI = WideChar(#15);
  403. WideDLE = WideChar(#16);
  404. WideDC1 = WideChar(#17);
  405. WideDC2 = WideChar(#18);
  406. WideDC3 = WideChar(#19);
  407. WideDC4 = WideChar(#20);
  408. WideNAK = WideChar(#21);
  409. WideSYN = WideChar(#22);
  410. WideETB = WideChar(#23);
  411. WideCAN = WideChar(#24);
  412. WideEM = WideChar(#25);
  413. WideEOF = WideChar(#26);
  414. WideESC = WideChar(#27);
  415. WideFS = WideChar(#28);
  416. WideGS = WideChar(#29);
  417. WideRS = WideChar(#30);
  418. WideUS = WideChar(#31);
  419. WideSP = WideChar(#32);
  420. WideDEL = WideChar(#127);
  421. WideXON = WideDC1;
  422. WideXOFF = WideDC3;
  423. WideSingleQuote = WideChar('''');
  424. WideDoubleQuote = WideChar('"');
  425. WideNoBreakSpace = WideChar(#$00A0);
  426. WideLineSeparator = WideChar(#$2028);
  427. WideParagraphSeparator = WideChar(#$2029);
  428. WideBOM_MSB_First = WideChar(#$FFFE);
  429. WideBOM_LSB_First = WideChar(#$FEFF);
  430. WideObjectReplacement = WideChar(#$FFFC);
  431. WideCharReplacement = WideChar(#$FFFD);
  432. WideInvalid = WideChar(#$FFFF);
  433. WideCopyrightSign = WideChar(#$00A9);
  434. WideRegisteredSign = WideChar(#$00AE);
  435. WideHighSurrogateFirst = WideChar(#$D800);
  436. WideHighSurrogateLast = WideChar(#$DB7F);
  437. WideLowSurrogateFirst = WideChar(#$DC00);
  438. WideLowSurrogateLast = WideChar(#$DFFF);
  439. WidePrivateHighSurrogateFirst = WideChar(#$DB80);
  440. WidePrivateHighSurrogateLast = WideChar(#$DBFF);
  441. { }
  442. { WideString constants }
  443. { }
  444. {$IFNDEF DELPHI5}
  445. // Both definitions for WideCRLF below fail with Delphi 5
  446. {$IFDEF DELPHI7_DOWN}
  447. const
  448. WideCRLF = WideString(WideCR) + WideString(WideLF);
  449. {$ELSE}
  450. const
  451. WideCRLF = WideCR + WideLF;
  452. {$ENDIF}
  453. {$ENDIF}
  454. { }
  455. { UCS4 constants }
  456. { }
  457. const
  458. Ucs4NULL = UCS4Char(AsciiNULL);
  459. Ucs4HT = UCS4Char(AsciiHT);
  460. Ucs4LF = UCS4Char(AsciiLF);
  461. Ucs4CR = UCS4Char(AsciiCR);
  462. Ucs4StringTerminator = UCS4Char($9C);
  463. { }
  464. { Unicode functions }
  465. { }
  466. function UnicodeIsAsciiChar(const Ch: WideChar): Boolean;
  467. function UnicodeIsWhiteSpace(const Ch: WideChar): Boolean;
  468. function UnicodeIsControl(const Ch: WideChar): Boolean;
  469. function UnicodeIsControlOrWhiteSpace(const Ch: WideChar): Boolean;
  470. function UnicodeIsIgnorable(const Ch: UCS4Char): Boolean;
  471. function UnicodeIsDash(const Ch: WideChar): Boolean;
  472. function UnicodeIsHyphen(const Ch: WideChar): Boolean;
  473. function UnicodeIsFullStop(const Ch: WideChar): Boolean;
  474. function UnicodeIsComma(const Ch: WideChar): Boolean;
  475. function UnicodeIsExclamationMark(const Ch: WideChar): Boolean;
  476. function UnicodeIsQuestionMark(const Ch: WideChar): Boolean;
  477. function UnicodeIsLeftParenthesis(const Ch: WideChar): Boolean;
  478. function UnicodeIsLeftBracket(const Ch: WideChar): Boolean;
  479. function UnicodeGetRightParenthesis(const LeftParenthesis: WideChar): WideChar;
  480. function UnicodeGetRightBracket(const LeftBracket: WideChar): WideChar;
  481. function UnicodeIsSingularQuotationMark(const Ch: WideChar): Boolean;
  482. function UnicodeIsOpeningQuotationMark(const Ch: WideChar): Boolean;
  483. function UnicodeIsClosingQuotationMark(const Ch: WideChar): Boolean;
  484. function UnicodeGetClosingQuotationMark(const OpeningQuote: WideChar): WideChar;
  485. function UnicodeGetOpeningQuotationMark(const ClosingQuote: WideChar): WideChar;
  486. function UnicodeIsPunctuation(const Ch: WideChar): Boolean;
  487. function UnicodeIsDecimalDigit(const Ch: UCS4Char): Boolean; overload;
  488. function UnicodeIsDecimalDigit(const Ch: WideChar): Boolean; overload;
  489. function UnicodeIsAsciiDecimalDigit(const Ch: WideChar): Boolean;
  490. function UnicodeDecimalDigitValue(const Ch: UCS4Char): Integer; overload;
  491. function UnicodeDecimalDigitValue(const Ch: WideChar): Integer; overload;
  492. function UnicodeFractionCharacterValue(const Ch: WideChar; var A, B: Integer): Boolean;
  493. function UnicodeRomanNumeralValue(const Ch: WideChar): Integer;
  494. function UnicodeIsAsciiHexDigit(const Ch: WideChar): Boolean;
  495. function UnicodeIsHexDigit(const Ch: UCS4Char): Boolean; overload;
  496. function UnicodeIsHexDigit(const Ch: WideChar): Boolean; overload;
  497. function UnicodeHexDigitValue(const Ch: UCS4Char): Integer; overload;
  498. function UnicodeHexDigitValue(const Ch: WideChar): Integer; overload;
  499. function UnicodeIsUpperCase(const Ch: WideChar): Boolean;
  500. function UnicodeIsLowerCase(const Ch: WideChar): Boolean;
  501. function UnicodeIsTitleCase(const Ch: WideChar): Boolean;
  502. function UnicodeIsLetter(const Ch: WideChar): Boolean;
  503. function UnicodeIsAlphabetic(const Ch: WideChar): Boolean;
  504. function UnicodeUpCase(const Ch: WideChar): WideChar;
  505. function UnicodeLowCase(const Ch: WideChar): WideChar;
  506. function UnicodeUpCaseFoldingW(const Ch: WideChar): WideString;
  507. function UnicodeUpCaseFoldingU(const Ch: WideChar): UnicodeString;
  508. function UnicodeLowCaseFoldingW(const Ch: WideChar): WideString;
  509. function UnicodeLowCaseFoldingU(const Ch: WideChar): UnicodeString;
  510. function UnicodeTitleCaseFoldingW(const Ch: WideChar): WideString;
  511. function UnicodeTitleCaseFoldingU(const Ch: WideChar): UnicodeString;
  512. function UnicodeCharIsEqualNoCase(const A, B: WideChar): Boolean;
  513. function UnicodeGetCombiningClass(const Ch: WideChar): Byte;
  514. function UnicodeGetCharacterDecompositionW(const Ch: WideChar): WideString; overload;
  515. function UnicodeGetCharacterDecompositionW(const Ch: UCS4Char): WideString; overload;
  516. function UnicodeUpperCaseW(const S: WideString): WideString;
  517. function UnicodeUpperCaseU(const S: UnicodeString): UnicodeString;
  518. function UnicodeLowerCaseW(const S: WideString): WideString;
  519. function UnicodeLowerCaseU(const S: UnicodeString): UnicodeString;
  520. function UnicodeUpperCaseFoldingW(const S: WideString): WideString;
  521. function UnicodeUpperCaseFoldingU(const S: UnicodeString): UnicodeString;
  522. function UnicodeLowerCaseFoldingW(const S: WideString): WideString;
  523. function UnicodeLowerCaseFoldingU(const S: UnicodeString): UnicodeString;
  524. { }
  525. { String functions }
  526. { }
  527. procedure SetLengthAndZeroA(var S: AnsiString; const NewLength: Integer);
  528. procedure SetLengthAndZeroW(var S: WideString; const NewLength: Integer);
  529. procedure SetLengthAndZeroU(var S: UnicodeString; const NewLength: Integer);
  530. {$IFNDEF ManagedCode}
  531. function StrPasP(const Buf; const BufSize: Integer): AnsiString;
  532. {$ENDIF}
  533. function StrLenA(const A: PAnsiChar): Integer;
  534. function StrPasA(const A: PAnsiChar): AnsiString;
  535. function StrLenW(const A: PWideChar): Integer;
  536. function StrPasW(const A: PWideChar): WideString;
  537. function StrPasU(const A: PWideChar): UnicodeString;
  538. function StringLen(const A: PChar): Integer;
  539. function StringPas(const A: PChar): String;
  540. function ToStringChA(const A: AnsiChar): String;
  541. function ToStringChW(const A: WideChar): String;
  542. function ToStringA(const A: AnsiString): String; {$IFDEF UseInline}inline;{$ENDIF}
  543. function ToStringW(const A: WideString): String; {$IFDEF UseInline}inline;{$ENDIF}
  544. function ToStringU(const A: UnicodeString): String; {$IFDEF UseInline}inline;{$ENDIF}
  545. function ToAnsiString(const A: String): AnsiString; {$IFDEF UseInline}inline;{$ENDIF}
  546. function ToWideString(const A: String): WideString; {$IFDEF UseInline}inline;{$ENDIF}
  547. function ToUnicodeString(const A: String): UnicodeString; {$IFDEF UseInline}inline;{$ENDIF}
  548. {$IFNDEF ManagedCode}
  549. function StrZLenA(const S: PAnsiChar): Integer;
  550. function StrZLenW(const S: PWideChar): Integer;
  551. function StrZLen(const S: PChar): Integer;
  552. function StrPToStrA(const P: PAnsiChar; const L: Integer): AnsiString;
  553. function StrPToStrW(const P: PWideChar; const L: Integer): WideString;
  554. function StrPToStrU(const P: PWideChar; const L: Integer): UnicodeString;
  555. function StrPToStr(const P: PChar; const L: Integer): String;
  556. {$ENDIF}
  557. { }
  558. { ASCII case conversion }
  559. { }
  560. function AsciiLowCaseA(const C: AnsiChar): AnsiChar;
  561. function AsciiLowCaseW(const C: WideChar): WideChar;
  562. function AsciiLowCase(const C: Char): Char;
  563. function AsciiUpCaseA(const C: AnsiChar): AnsiChar;
  564. function AsciiUpCaseW(const C: WideChar): WideChar;
  565. function AsciiUpCase(const C: Char): Char;
  566. procedure AsciiConvertUpperA(var S: AnsiString);
  567. procedure AsciiConvertUpperW(var S: WideString);
  568. procedure AsciiConvertUpperU(var S: UnicodeString);
  569. procedure AsciiConvertUpper(var S: String);
  570. procedure AsciiConvertLowerA(var S: AnsiString);
  571. procedure AsciiConvertLowerW(var S: WideString);
  572. procedure AsciiConvertLowerU(var S: UnicodeString);
  573. procedure AsciiConvertLower(var S: String);
  574. procedure AsciiConvertFirstUpA(var S: AnsiString);
  575. procedure AsciiConvertFirstUpW(var S: WideString);
  576. procedure AsciiConvertFirstUp(var S: String);
  577. function AsciiFirstUpA(const S: AnsiString): AnsiString;
  578. function AsciiFirstUpW(const S: WideString): WideString;
  579. function AsciiFirstUp(const S: String): String;
  580. procedure AsciiConvertArrayUpper(var S: AsciiStringArray);
  581. procedure AsciiConvertArrayLower(var S: AsciiStringArray);
  582. { }
  583. { ASCII string }
  584. { }
  585. function IsAsciiCharA(const C: AnsiChar): Boolean; {$IFDEF UseInline}inline;{$ENDIF}
  586. function IsAsciiCharW(const C: WideChar): Boolean; {$IFDEF UseInline}inline;{$ENDIF}
  587. function IsAsciiChar(const C: Char): Boolean; {$IFDEF UseInline}inline;{$ENDIF}
  588. function IsAsciiStringA(const S: AnsiString): Boolean;
  589. function IsAsciiStringW(const S: WideString): Boolean;
  590. function IsAsciiStringU(const S: UnicodeString): Boolean;
  591. function IsAsciiString(const S: String): Boolean;
  592. { }
  593. { ASCII functions }
  594. { }
  595. function AsciiHexCharValue(const C: AnsiChar): Integer;
  596. function AsciiHexCharValueW(const C: WideChar): Integer;
  597. function AsciiIsHexChar(const C: AnsiChar): Boolean;
  598. function AsciiIsHexCharW(const C: WideChar): Boolean;
  599. function AsciiDecimalCharValue(const C: AnsiChar): Integer;
  600. function AsciiDecimalCharValueW(const C: WideChar): Integer;
  601. function AsciiIsDecimalChar(const C: AnsiChar): Boolean;
  602. function AsciiIsDecimalCharW(const C: WideChar): Boolean;
  603. function AsciiOctalCharValue(const C: AnsiChar): Integer;
  604. function AsciiOctalCharValueW(const C: WideChar): Integer;
  605. function AsciiIsOctalChar(const C: AnsiChar): Boolean;
  606. function AsciiIsOctalCharW(const C: WideChar): Boolean;
  607. { }
  608. { Compare }
  609. { }
  610. { Returns -1 if A < B }
  611. { 0 if A = B }
  612. { 1 if A > B }
  613. { }
  614. function CharCompareA(const A, B: AnsiChar): Integer; {$IFDEF UseInline}inline;{$ENDIF}
  615. function CharCompareW(const A, B: WideChar): Integer; {$IFDEF UseInline}inline;{$ENDIF}
  616. function CharCompare(const A, B: Char): Integer; {$IFDEF UseInline}inline;{$ENDIF}
  617. function CharCompareNoAsciiCaseA(const A, B: AnsiChar): Integer; {$IFDEF UseInline}inline;{$ENDIF}
  618. function CharCompareNoAsciiCaseW(const A, B: WideChar): Integer; {$IFDEF UseInline}inline;{$ENDIF}
  619. function CharCompareNoAsciiCase(const A, B: Char): Integer; {$IFDEF UseInline}inline;{$ENDIF}
  620. function CharCompareNoUnicodeCaseW(const A, B: WideChar): Integer; {$IFDEF UseInline}inline;{$ENDIF}
  621. function CharEqualNoAsciiCaseA(const A, B: AnsiChar): Boolean; {$IFDEF UseInline}inline;{$ENDIF}
  622. function CharEqualNoAsciiCaseW(const A, B: WideChar): Boolean; {$IFDEF UseInline}inline;{$ENDIF}
  623. function CharEqualNoAsciiCase(const A, B: Char): Boolean; {$IFDEF UseInline}inline;{$ENDIF}
  624. {$IFDEF ManagedCode}
  625. function StrPCompareA(const A, B: AnsiString; const Len: Integer): Integer;
  626. function StrPCompareNoAsciiCaseA(const A, B: AnsiString; const Len: Integer): Integer;
  627. {$ELSE}
  628. function StrPCompareA(const A, B: PAnsiChar; const Len: Integer): Integer;
  629. function StrPCompareW(const A, B: PWideChar; const Len: Integer): Integer;
  630. function StrPCompare(const A, B: PChar; const Len: Integer): Integer;
  631. function StrPCompareNoAsciiCaseA(const A, B: PAnsiChar; const Len: Integer): Integer;
  632. function StrPCompareNoAsciiCaseW(const A, B: PWideChar; const Len: Integer): Integer;
  633. function StrPCompareNoAsciiCase(const A, B: PChar; const Len: Integer): Integer;
  634. function StrPCompareNoUnicodeCaseW(const A, B: PWideChar; const Len: Integer): Integer;
  635. {$ENDIF}
  636. function StrCompareA(const A, B: AnsiString): Integer;
  637. function StrCompareW(const A, B: WideString): Integer;
  638. function StrCompareU(const A, B: UnicodeString): Integer;
  639. function StrCompare(const A, B: String): Integer;
  640. function StrCompareNoAsciiCaseA(const A, B: AnsiString): Integer;
  641. function StrCompareNoAsciiCaseW(const A, B: WideString): Integer;
  642. function StrCompareNoAsciiCaseU(const A, B: UnicodeString): Integer;
  643. function StrCompareNoAsciiCase(const A, B: String): Integer;
  644. function StrCompareNoUnicodeCaseW(const A, B: WideString): Integer;
  645. function StrCompareNoUnicodeCaseU(const A, B: UnicodeString): Integer;
  646. { }
  647. { Match }
  648. { }
  649. function WideCharInCharSet(const A: WideChar; const C: CharSet): Boolean; {$IFDEF UseInline}inline;{$ENDIF}
  650. function CharInCharSet(const A: Char; const C: CharSet): Boolean; {$IFDEF UseInline}inline;{$ENDIF}
  651. function CharMatchNoAsciiCaseA(const A, B: AnsiChar): Boolean;
  652. function CharMatchNoAsciiCaseW(const A, B: WideChar): Boolean;
  653. function CharMatchNoAsciiCaseAW(const A: AnsiChar; const B: WideChar): Boolean;
  654. function CharMatchNoAsciiCase(const A, B: Char): Boolean;
  655. function CharMatchA(const A, B: AnsiChar; const AsciiCaseSensitive: Boolean = True): Boolean;
  656. function CharMatchW(const A, B: WideChar; const AsciiCaseSensitive: Boolean = True): Boolean;
  657. function CharMatchAW(const A: AnsiChar; const B: WideChar; const AsciiCaseSensitive: Boolean = True): Boolean;
  658. function CharMatch(const A, B: Char; const AsciiCaseSensitive: Boolean = True): Boolean;
  659. function CharSetMatchCharA(const A: CharSet; const B: AnsiChar; const AsciiCaseSensitive: Boolean = True): Boolean;
  660. function CharSetMatchCharW(const A: CharSet; const B: WideChar; const AsciiCaseSensitive: Boolean = True): Boolean;
  661. function CharSetMatchChar(const A: CharSet; const B: Char; const AsciiCaseSensitive: Boolean = True): Boolean;
  662. {$IFNDEF ManagedCode}
  663. function StrPMatchA(const A, B: PAnsiChar; const Len: Integer): Boolean; overload;
  664. function StrPMatchW(const A, B: PWideChar; const Len: Integer): Boolean; overload;
  665. function StrPMatchAW(const A: PWideChar; B: PAnsiChar; const Len: Integer): Boolean; overload;
  666. function StrPMatch(const A, B: PChar; const Len: Integer): Boolean; overload;
  667. function StrPMatchA(const S, M: PAnsiChar; const LenS, LenM: Integer): Boolean; overload;
  668. function StrPMatchW(const S, M: PWideChar; const LenS, LenM: Integer): Boolean; overload;
  669. function StrPMatchAW(const S: PWideChar; const M: PAnsiChar; const LenS, LenM: Integer): Boolean; overload;
  670. function StrPMatch(const S, M: PChar; const LenS, LenM: Integer): Boolean; overload;
  671. function StrPMatchStrPA(const S: PChar; const M: PAnsiChar; const LenS, LenM: Integer): Boolean;
  672. function StrPMatchStrA(const S: PAnsiChar; const Len: Integer; const M: AnsiString): Boolean;
  673. function StrPMatchStrW(const S: PWideChar; const Len: Integer; const M: WideString): Boolean;
  674. function StrPMatchStrAW(const S: PWideChar; const Len: Integer; const M: AnsiString): Boolean;
  675. function StrPMatchStrU(const S: PWideChar; const Len: Integer; const M: UnicodeString): Boolean;
  676. function StrPMatchStr(const S: PChar; const Len: Integer; const M: String): Boolean;
  677. function StrPMatchNoAsciiCaseA(const A, B: PAnsiChar; const Len: Integer): Boolean;
  678. function StrPMatchNoAsciiCaseW(const A, B: PWideChar; const Len: Integer): Boolean;
  679. function StrPMatchNoAsciiCaseAW(const A: PWideChar; const B: PAnsiChar; const Len: Integer): Boolean;
  680. function StrPMatchNoAsciiCase(const A, B: PChar; const Len: Integer): Boolean;
  681. function StrPMatchNoUnicodeCaseW(const A, B: PWideChar; const Len: Integer): Boolean;
  682. function StrPMatchLenA(const P: PAnsiChar; const Len: Integer; const M: CharSet): Integer;
  683. function StrPMatchLenW(const P: PWideChar; const Len: Integer; const M: CharSet): Integer; overload;
  684. function StrPMatchLenW(const P: PWideChar; const Len: Integer; const M: TWideCharMatchFunction): Integer; overload;
  685. function StrPMatchLen(const P: PChar; const Len: Integer; const M: CharSet): Integer;
  686. function StrPMatchCountA(const P: PAnsiChar; const Len: Integer; const M: CharSet): Integer;
  687. function StrPMatchCountW(const P: PWideChar; const Len: Integer; const M: CharSet): Integer; overload;
  688. function StrPMatchCountW(const P: PWideChar; const Len: Integer; const M: TWideCharMatchFunction): Integer; overload;
  689. function StrPMatchCharA(const P: PAnsiChar; const Len: Integer; const M: CharSet): Boolean;
  690. function StrPMatchCharW(const P: PWideChar; const Len: Integer; const M: CharSet): Boolean; overload;
  691. function StrPMatchCharW(const P: PWideChar; const Len: Integer; const M: TWideCharMatchFunction): Boolean; overload;
  692. function StrPMatchChar(const P: PChar; const Len: Integer; const M: CharSet): Boolean;
  693. function StrZMatchLenA(const P: PAnsiChar; const M: CharSet; const MaxLen: Integer = -1): Integer;
  694. function StrZMatchLenW(const P: PWideChar; const M: CharSet; const MaxLen: Integer = -1): Integer; overload;
  695. function StrZMatchLenW(const P: PWideChar; const M: TWideCharMatchFunction; const MaxLen: Integer = -1): Integer; overload;
  696. function StrZMatchStrA(const P: PAnsiChar; const M: AnsiString): Boolean;
  697. function StrZMatchStrW(const P: PWideChar; const M: WideString): Boolean;
  698. function StrZMatchStrAW(const P: PWideChar; const M: AnsiString): Boolean;
  699. function StrZMatchStrU(const P: PWideChar; const M: UnicodeString): Boolean;
  700. function StrZMatchStr(const P: PChar; const M: String): Boolean;
  701. function StrZMatchStrNoAsciiCaseA(const P: PAnsiChar; const M: AnsiString): Boolean;
  702. function StrZMatchStrNoAsciiCaseW(const P: PWideChar; const M: WideString): Boolean;
  703. function StrZMatchStrNoAsciiCaseAW(const P: PWideChar; const M: AnsiString): Boolean;
  704. function StrZMatchStrNoAsciiCaseU(const P: PWideChar; const M: UnicodeString): Boolean;
  705. function StrZMatchStrNoAsciiCase(const P: PChar; const M: String): Boolean;
  706. function StrZMatchStrNoUnicodeCaseW(const P: PWideChar; const M: WideString): Boolean;
  707. function StrZMatchStrNoUnicodeCaseU(const P: PWideChar; const M: UnicodeString): Boolean;
  708. function StrZMatchStrAsciiA(const P: PAnsiChar; const M: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  709. function StrZMatchStrAsciiW(const P: PWideChar; const M: WideString; const AsciiCaseSensitive: Boolean): Boolean;
  710. function StrZMatchStrAsciiAW(const P: PWideChar; const M: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  711. function StrZMatchStrAsciiU(const P: PWideChar; const M: UnicodeString; const AsciiCaseSensitive: Boolean): Boolean;
  712. function StrZMatchStrAscii(const P: PChar; const M: String; const AsciiCaseSensitive: Boolean): Boolean;
  713. function StrZMatchStrUnicodeW(const P: PWideChar; const M: WideString; const UnicodeCaseSensitive: Boolean): Boolean;
  714. function StrZMatchStrUnicodeU(const P: PWideChar; const M: UnicodeString; const UnicodeCaseSensitive: Boolean): Boolean;
  715. {$ENDIF}
  716. function StrMatchA(const S, M: AnsiString; const Index: Integer = 1): Boolean;
  717. function StrMatchW(const S, M: WideString; const Index: Integer = 1): Boolean;
  718. function StrMatchAW(const S: WideString; const M: AnsiString; const Index: Integer = 1): Boolean;
  719. function StrMatchU(const S, M: UnicodeString; const Index: Integer = 1): Boolean;
  720. function StrMatchAU(const S: UnicodeString; const M: AnsiString; const Index: Integer = 1): Boolean;
  721. function StrMatch(const S, M: String; const Index: Integer = 1): Boolean;
  722. function StrMatchNoAsciiCaseA(const S, M: AnsiString; const Index: Integer = 1): Boolean;
  723. function StrMatchNoAsciiCaseW(const S, M: WideString; const Index: Integer = 1): Boolean;
  724. function StrMatchNoAsciiCaseAW(const S: WideString; const M: AnsiString; const Index: Integer = 1): Boolean;
  725. function StrMatchNoAsciiCaseU(const S, M: UnicodeString; const Index: Integer = 1): Boolean;
  726. function StrMatchNoAsciiCaseAU(const S: UnicodeString; const M: AnsiString; const Index: Integer = 1): Boolean;
  727. function StrMatchNoAsciiCase(const S, M: String; const Index: Integer = 1): Boolean;
  728. function StrMatchNoUnicodeCaseW(const S, M: WideString; const Index: Integer = 1): Boolean;
  729. function StrMatchNoUnicodeCaseU(const S, M: UnicodeString; const Index: Integer = 1): Boolean;
  730. function StrMatchLeftA(const S, M: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  731. function StrMatchLeftW(const S, M: WideString; const AsciiCaseSensitive: Boolean = True): Boolean;
  732. function StrMatchLeftAW(const S: WideString; const M: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  733. function StrMatchLeftU(const S, M: UnicodeString; const AsciiCaseSensitive: Boolean = True): Boolean;
  734. function StrMatchLeftAU(const S: UnicodeString; const M: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  735. function StrMatchLeft(const S, M: String; const AsciiCaseSensitive: Boolean = True): Boolean;
  736. function StrMatchRightA(const S, M: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  737. function StrMatchRightW(const S, M: WideString; const AsciiCaseSensitive: Boolean = True): Boolean;
  738. function StrMatchRightAW(const S: WideString; const M: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  739. function StrMatchRightU(const S, M: UnicodeString; const AsciiCaseSensitive: Boolean = True): Boolean;
  740. function StrMatchRightAU(const S: UnicodeString; const M: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  741. function StrMatchRight(const S, M: String; const AsciiCaseSensitive: Boolean = True): Boolean;
  742. function StrMatchLenA(const S: AnsiString; const M: CharSet; const Index: Integer = 1): Integer;
  743. function StrMatchLenW(const S: WideString; const M: CharSet; const Index: Integer = 1): Integer; overload;
  744. function StrMatchLenW(const S: WideString; const M: TWideCharMatchFunction; const Index: Integer = 1): Integer; overload;
  745. function StrMatchLenU(const S: UnicodeString; const M: CharSet; const Index: Integer = 1): Integer; overload;
  746. function StrMatchLenU(const S: UnicodeString; const M: TWideCharMatchFunction; const Index: Integer = 1): Integer; overload;
  747. function StrMatchLen(const S: String; const M: CharSet; const Index: Integer = 1): Integer;
  748. function StrMatchCharA(const S: AnsiString; const M: CharSet): Boolean;
  749. function StrMatchCharW(const S: WideString; const M: CharSet): Boolean; overload;
  750. function StrMatchCharW(const S: WideString; const M: TWideCharMatchFunction): Boolean; overload;
  751. function StrMatchCharU(const S: UnicodeString; const M: CharSet): Boolean; overload;
  752. function StrMatchCharU(const S: UnicodeString; const M: TWideCharMatchFunction): Boolean; overload;
  753. function StrMatchChar(const S: String; const M: CharSet): Boolean;
  754. { }
  755. { Pattern Matcher }
  756. { }
  757. { Matches a subset of regular expressions (* . ? and []) }
  758. { '*' Matches zero or more of any character }
  759. { '.' Matches exactly one character }
  760. { '?' Matches zero or one character }
  761. { '[' <char set> ']' Matches character from <char set> }
  762. { '[^' <char set> ']' Matches character not in <char set> }
  763. { <char set> can include multiple ranges and escaped characters }
  764. { '\n' matches NewLine (#10) }
  765. { '\r' matches Return (#13) }
  766. { '\\' matches a slash ('\') }
  767. { StrZMatchPattern returns the number of matched characters, }
  768. { or < 0 if no match. }
  769. { StrPosPattern returns the index of matched pattern (F) in string S, }
  770. { or 0 if not found. Len is the length of the matched pattern. }
  771. { }
  772. {$IFNDEF ManagedCode}
  773. type
  774. TMatchPatternGreed = (
  775. mpgLazy,
  776. mpgGreedy,
  777. mpgGreedyNoBacktrack);
  778. function StrZMatchPatternA(M, S: PAnsiChar; const G: TMatchPatternGreed = mpgLazy): Integer;
  779. function StrZMatchPatternW(M, S: PWideChar; const G: TMatchPatternGreed = mpgLazy): Integer;
  780. function StrEqualPatternA(const M, S: AnsiString; const G: TMatchPatternGreed = mpgLazy): Boolean;
  781. function StrEqualPatternW(const M, S: WideString; const G: TMatchPatternGreed = mpgLazy): Boolean;
  782. function StrEqualPatternU(const M, S: UnicodeString; const G: TMatchPatternGreed = mpgLazy): Boolean;
  783. function StrEqualPattern(const M, S: String; const G: TMatchPatternGreed = mpgLazy): Boolean;
  784. function StrPosPatternA(const F, S: AnsiString; var Len: Integer;
  785. const StartIndex: Integer = 1; const G: TMatchPatternGreed = mpgLazy): Integer;
  786. function StrPosPatternW(const F, S: WideString; var Len: Integer;
  787. const StartIndex: Integer = 1; const G: TMatchPatternGreed = mpgLazy): Integer;
  788. function StrPosPatternU(const F, S: UnicodeString; var Len: Integer;
  789. const StartIndex: Integer = 1; const G: TMatchPatternGreed = mpgLazy): Integer;
  790. {$ENDIF}
  791. { }
  792. { Equal }
  793. { }
  794. {$IFNDEF ManagedCode}
  795. function StrPEqual(const P1, P2: PAnsiChar; const Len1, Len2: Integer; const AsciiCaseSensitive: Boolean = True): Boolean;
  796. function StrPEqualStr(const P: PAnsiChar; const Len: Integer; const S: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  797. {$ENDIF}
  798. function StrEqualA(const A, B: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  799. function StrEqualW(const A, B: WideString; const AsciiCaseSensitive: Boolean = True): Boolean;
  800. function StrEqualAW(const A: WideString; const B: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  801. function StrEqualU(const A, B: UnicodeString; const AsciiCaseSensitive: Boolean = True): Boolean;
  802. function StrEqualAU(const A: UnicodeString; const B: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  803. function StrEqual(const A, B: String; const AsciiCaseSensitive: Boolean = True): Boolean;
  804. function StrEqualNoAsciiCaseA(const A, B: AnsiString): Boolean;
  805. function StrEqualNoAsciiCaseW(const A, B: WideString): Boolean;
  806. function StrEqualNoAsciiCaseAW(const A: WideString; const B: AnsiString): Boolean;
  807. function StrEqualNoAsciiCaseU(const A, B: UnicodeString): Boolean;
  808. function StrEqualNoAsciiCaseAU(const A: UnicodeString; const B: AnsiString): Boolean;
  809. function StrEqualNoAsciiCase(const A, B: String): Boolean;
  810. function StrEqualNoUnicodeCaseW(const A, B: WideString): Boolean;
  811. function StrEqualNoUnicodeCaseU(const A, B: UnicodeString): Boolean;
  812. { }
  813. { Validation }
  814. { }
  815. function StrIsNumericA(const S: AnsiString): Boolean;
  816. function StrIsNumericW(const S: WideString): Boolean;
  817. function StrIsNumeric(const S: String): Boolean;
  818. function StrIsHexA(const S: AnsiString): Boolean;
  819. function StrIsHexW(const S: WideString): Boolean;
  820. function StrIsHex(const S: String): Boolean;
  821. function StrIsAlphaA(const S: AnsiString): Boolean;
  822. function StrIsAlphaW(const S: WideString): Boolean;
  823. function StrIsAlpha(const S: String): Boolean;
  824. function StrIsAlphaNumericA(const S: AnsiString): Boolean;
  825. function StrIsAlphaNumericW(const S: WideString): Boolean;
  826. function StrIsAlphaNumeric(const S: String): Boolean;
  827. function StrIsIntegerA(const S: AnsiString): Boolean;
  828. function StrIsIntegerW(const S: WideString): Boolean;
  829. function StrIsInteger(const S: String): Boolean;
  830. { }
  831. { Pos }
  832. { }
  833. {$IFNDEF ManagedCode}
  834. function StrPPosChar(const F: AnsiChar; const S: PAnsiChar; const Len: Integer): Integer; overload;
  835. function StrPPosChar(const F: CharSet; const S: PAnsiChar; const Len: Integer): Integer; overload;
  836. function StrPPos(const F, S: PAnsiChar; const LenF, LenS: Integer): Integer;
  837. function StrPPosStr(const F: String; const S: PAnsiChar; const Len: Integer): Integer;
  838. function StrZPosCharA(const F: AnsiChar; const S: PAnsiChar): Integer;
  839. function StrZPosCharW(const F: WideChar; const S: PWideChar): Integer;
  840. function StrZPosChar(const F: Char; const S: PChar): Integer;
  841. function StrZPosCharSetA(const F: CharSet; const S: PAnsiChar): Integer;
  842. function StrZPosCharSetW(const F: CharSet; const S: PWideChar): Integer; overload;
  843. function StrZPosCharSetW(const F: TWideCharMatchFunction; const S: PWideChar): Integer; overload;
  844. function StrZPosCharSet(const F: CharSet; const S: PChar): Integer;
  845. function StrZPosNotCharSetA(const F: CharSet; const S: PAnsiChar): Integer;
  846. function StrZPosNotCharSetW(const F: CharSet; const S: PWideChar): Integer; overload;
  847. function StrZPosNotCharSetW(const F: TWideCharMatchFunction; const S: PWideChar): Integer; overload;
  848. function StrZPosNotCharSet(const F: CharSet; const S: PChar): Integer;
  849. function StrZPosA(const F: AnsiString; const S: PAnsiChar): Integer;
  850. function StrZPosW(const F: WideString; const S: PWideChar): Integer;
  851. function StrZPosAW(const F: AnsiString; const S: PWideChar): Integer;
  852. {$ENDIF}
  853. function PosCharA(const F: AnsiChar; const S: AnsiString; const Index: Integer = 1): Integer;
  854. function PosCharW(const F: WideChar; const S: WideString; const Index: Integer = 1): Integer;
  855. function PosCharU(const F: WideChar; const S: UnicodeString; const Index: Integer = 1): Integer;
  856. function PosChar(const F: Char; const S: String; const Index: Integer = 1): Integer;
  857. function PosCharSetA(const F: CharSet; const S: AnsiString; const Index: Integer = 1): Integer;
  858. function PosCharSetW(const F: CharSet; const S: WideString; const Index: Integer = 1): Integer; overload;
  859. function PosCharSetW(const F: TWideCharMatchFunction; const S: WideString; const Index: Integer = 1): Integer; overload;
  860. function PosCharSetU(const F: CharSet; const S: UnicodeString; const Index: Integer = 1): Integer; overload;
  861. function PosCharSetU(const F: TWideCharMatchFunction; const S: UnicodeString; const Index: Integer = 1): Integer; overload;
  862. function PosCharSet(const F: CharSet; const S: String; const Index: Integer = 1): Integer;
  863. function PosNotCharA(const F: AnsiChar; const S: AnsiString; const Index: Integer = 1): Integer;
  864. function PosNotCharW(const F: WideChar; const S: WideString; const Index: Integer = 1): Integer;
  865. function PosNotCharU(const F: WideChar; const S: UnicodeString; const Index: Integer = 1): Integer;
  866. function PosNotChar(const F: Char; const S: String; const Index: Integer = 1): Integer;
  867. function PosNotCharSetA(const F: CharSet; const S: AnsiString; const Index: Integer = 1): Integer;
  868. function PosNotCharSetW(const F: CharSet; const S: WideString; const Index: Integer = 1): Integer; overload;
  869. function PosNotCharSetW(const F: TWideCharMatchFunction; const S: WideString; const Index: Integer = 1): Integer; overload;
  870. function PosNotCharSetU(const F: CharSet; const S: UnicodeString; const Index: Integer = 1): Integer; overload;
  871. function PosNotCharSetU(const F: TWideCharMatchFunction; const S: UnicodeString; const Index: Integer = 1): Integer; overload;
  872. function PosNotCharSet(const F: CharSet; const S: String; const Index: Integer = 1): Integer;
  873. function PosCharRevA(const F: AnsiChar; const S: AnsiString; const Index: Integer = 1): Integer;
  874. function PosCharRevW(const F: WideChar; const S: WideString; const Index: Integer = 1): Integer;
  875. function PosCharRevU(const F: WideChar; const S: UnicodeString; const Index: Integer = 1): Integer;
  876. function PosCharRev(const F: Char; const S: String; const Index: Integer = 1): Integer;
  877. function PosCharSetRevA(const F: CharSet; const S: AnsiString; const Index: Integer = 1): Integer;
  878. function PosCharSetRevW(const F: CharSet; const S: WideString; const Index: Integer = 1): Integer; overload;
  879. function PosCharSetRevW(const F: TWideCharMatchFunction; const S: WideString; const Index: Integer = 1): Integer; overload;
  880. function PosCharSetRevU(const F: CharSet; const S: UnicodeString; const Index: Integer = 1): Integer; overload;
  881. function PosCharSetRevU(const F: TWideCharMatchFunction; const S: UnicodeString; const Index: Integer = 1): Integer; overload;
  882. function PosCharSetRev(const F: CharSet; const S: String; const Index: Integer = 1): Integer;
  883. function PosStrA(const F, S: AnsiString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  884. function PosStrW(const F, S: WideString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  885. function PosStrAW(const F: AnsiString; const S: WideString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  886. function PosStrU(const F, S: UnicodeString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  887. function PosStrAU(const F: AnsiString; const S: UnicodeString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  888. function PosStr(const F, S: String; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  889. function PosStrRevA(const F, S: AnsiString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  890. function PosStrRevW(const F, S: WideString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  891. function PosStrRevU(const F, S: UnicodeString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  892. function PosStrRev(const F, S: String; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  893. function PosStrRevIdxA(const F, S: AnsiString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  894. function PosStrRevIdxW(const F, S: WideString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  895. function PosStrRevIdxU(const F, S: UnicodeString; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  896. function PosStrRevIdx(const F, S: String; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  897. function PosNStrA(const F, S: AnsiString; const N: Integer; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  898. function PosNStrW(const F, S: WideString; const N: Integer; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  899. function PosNStrU(const F, S: UnicodeString; const N: Integer; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  900. function PosNStr(const F, S: String; const N: Integer; const Index: Integer = 1; const AsciiCaseSensitive: Boolean = True): Integer;
  901. { }
  902. { Skip (Null terminated string pointers) }
  903. { }
  904. {$IFNDEF ManagedCode}
  905. function StrZSkipCharA(var P: PAnsiChar; const C: AnsiChar): Boolean; overload;
  906. function StrZSkipCharA(var P: PAnsiChar; const C: CharSet): Boolean; overload;
  907. function StrZSkipCharW(var P: PWideChar; const C: WideChar): Boolean; overload;
  908. function StrZSkipCharW(var P: PWideChar; const C: CharSet): Boolean; overload;
  909. function StrZSkipCharW(var P: PWideChar; const C: TWideCharMatchFunction): Boolean; overload;
  910. function StrZSkipChar(var P: PChar; const C: Char): Boolean; overload;
  911. function StrZSkipChar(var P: PChar; const C: CharSet): Boolean; overload;
  912. function StrZSkipAllA(var P: PAnsiChar; const C: AnsiChar): Integer; overload;
  913. function StrZSkipAllA(var P: PAnsiChar; const C: CharSet): Integer; overload;
  914. function StrZSkipAllW(var P: PWideChar; const C: WideChar): Integer; overload;
  915. function StrZSkipAllW(var P: PWideChar; const C: CharSet): Integer; overload;
  916. function StrZSkipAllW(var P: PWideChar; const C: TWideCharMatchFunction): Integer; overload;
  917. function StrZSkipAll(var P: PChar; const C: Char): Integer; overload;
  918. function StrZSkipAll(var P: PChar; const C: CharSet): Integer; overload;
  919. function StrZSkipToCharA(var P: PAnsiChar; const C: AnsiChar): Integer; overload;
  920. function StrZSkipToCharA(var P: PAnsiChar; const C: CharSet): Integer; overload;
  921. function StrZSkipToCharW(var P: PWideChar; const C: WideChar): Integer; overload;
  922. function StrZSkipToCharW(var P: PWideChar; const C: CharSet): Integer; overload;
  923. function StrZSkipToCharW(var P: PWideChar; const C: TWideCharMatchFunction): Integer; overload;
  924. function StrZSkipToChar(var P: PChar; const C: CharSet): Integer;
  925. function StrZSkipToStrA(var P: PAnsiChar; const S: AnsiString; const AsciiCaseSensitive: Boolean = True): Integer;
  926. function StrZSkipToStrW(var P: PWideChar; const S: WideString; const AsciiCaseSensitive: Boolean = True): Integer;
  927. function StrZSkipToStrAW(var P: PWideChar; const S: AnsiString; const AsciiCaseSensitive: Boolean = True): Integer;
  928. function StrZSkipToStr(var P: PChar; const S: String; const AsciiCaseSensitive: Boolean = True): Integer;
  929. function StrZSkip2CharSeq(var P: PAnsiChar; const S1, S2: CharSet): Boolean;
  930. function StrZSkip3CharSeq(var P: PAnsiChar; const S1, S2, S3: CharSet): Boolean;
  931. function StrZSkipStrA(var P: PAnsiChar; const S: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  932. function StrZSkipStrW(var P: PWideChar; const S: WideString; const AsciiCaseSensitive: Boolean = True): Boolean;
  933. function StrZSkipStrAW(var P: PWideChar; const S: AnsiString; const AsciiCaseSensitive: Boolean = True): Boolean;
  934. function StrZSkipStr(var P: PChar; const S: String; const AsciiCaseSensitive: Boolean = True): Boolean;
  935. {$ENDIF}
  936. { }
  937. { Extract (Null terminated string pointers) }
  938. { }
  939. {$IFNDEF ManagedCode}
  940. function StrZExtractAllA(var P: PAnsiChar; const C: AnsiChar): AnsiString; overload;
  941. function StrZExtractAllA(var P: PAnsiChar; const C: CharSet): AnsiString; overload;
  942. function StrZExtractAllW(var P: PWideChar; const C: WideChar): WideString; overload;
  943. function StrZExtractAllW(var P: PWideChar; const C: CharSet): WideString; overload;
  944. function StrZExtractAllW(var P: PWideChar; const C: TWideCharMatchFunction): WideString; overload;
  945. function StrZExtractAllU(var P: PWideChar; const C: WideChar): UnicodeString; overload;
  946. function StrZExtractAllU(var P: PWideChar; const C: CharSet): UnicodeString; overload;
  947. function StrZExtractAllU(var P: PWideChar; const C: TWideCharMatchFunction): UnicodeString; overload;
  948. function StrZExtractAll(var P: PChar; const C: Char): String; overload;
  949. function StrZExtractAll(var P: PChar; const C: CharSet): String; overload;
  950. function StrZExtractToA(var P: PAnsiChar; const C: AnsiChar): AnsiString; overload;
  951. function StrZExtractToA(var P: PAnsiChar; const C: CharSet): AnsiString; overload;
  952. function StrZExtractToW(var P: PWideChar; const C: WideChar): WideString; overload;
  953. function StrZExtractToW(var P: PWideChar; const C: CharSet): WideString; overload;
  954. function StrZExtractToW(var P: PWideChar; const C: TWideCharMatchFunction): WideString; overload;
  955. function StrZExtractToU(var P: PWideChar; const C: WideChar): UnicodeString; overload;
  956. function StrZExtractToU(var P: PWideChar; const C: CharSet): UnicodeString; overload;
  957. function StrZExtractToU(var P: PWideChar; const C: TWideCharMatchFunction): UnicodeString; overload;
  958. function StrZExtractTo(var P: PChar; const C: CharSet): String;
  959. function StrZExtractToStrA(var P: PAnsiChar; const S: AnsiString; const CaseSensitive: Boolean = True): AnsiString;
  960. function StrZExtractToStrW(var P: PWideChar; const S: WideString; const CaseSensitive: Boolean = True): WideString;
  961. function StrZExtractToStrAW(var P: PWideChar; const S: AnsiString; const CaseSensitive: Boolean = True): WideString;
  962. function StrZExtractToStrU(var P: PWideChar; const S: UnicodeString; const CaseSensitive: Boolean = True): UnicodeString;
  963. function StrZExtractToStrAU(var P: PWideChar; const S: AnsiString; const CaseSensitive: Boolean = True): UnicodeString;
  964. function StrZExtractToStr(var P: PChar; const S: String; const CaseSensitive: Boolean = True): String;
  965. function StrZExtractQuotedA(var P: PAnsiChar; var S: AnsiString; const Quote: CharSet = ['''', '"']): Boolean;
  966. function StrZExtractQuotedW(var P: PWideChar; var S: WideString; const Quote: CharSet = ['''', '"']): Boolean;
  967. function StrZExtractQuotedU(var P: PWideChar; var S: UnicodeString; const Quote: CharSet = ['''', '"']): Boolean;
  968. function StrZExtractQuoted(var P: PChar; var S: String; const Quote: CharSet = ['''', '"']): Boolean;
  969. {$ENDIF}
  970. { }
  971. { Copy }
  972. { }
  973. { Out-of-range values of StartIndex, StopIndex and Count are clipped. }
  974. { These variants return a reference to the existing string if possible. }
  975. { }
  976. function CopyRangeA(const S: AnsiString; const StartIndex, StopIndex: Integer): AnsiString;
  977. function CopyRangeW(const S: WideString; const StartIndex, StopIndex: Integer): WideString;
  978. function CopyRangeU(const S: UnicodeString; const StartIndex, StopIndex: Integer): UnicodeString;
  979. function CopyRange(const S: String; const StartIndex, StopIndex: Integer): String;
  980. function CopyFromA(const S: AnsiString; const Index: Integer): AnsiString;
  981. function CopyFromW(const S: WideString; const Index: Integer): WideString;
  982. function CopyFromU(const S: UnicodeString; const Index: Integer): UnicodeString;
  983. function CopyFrom(const S: String; const Index: Integer): String;
  984. function CopyLeftA(const S: AnsiString; const Count: Integer): AnsiString;
  985. function CopyLeftW(const S: WideString; const Count: Integer): WideString;
  986. function CopyLeftU(const S: UnicodeString; const Count: Integer): UnicodeString;
  987. function CopyLeft(const S: String; const Count: Integer): String;
  988. function CopyRightA(const S: AnsiString; const Count: Integer): AnsiString;
  989. function CopyRightW(const S: WideString; const Count: Integer): WideString;
  990. function CopyRightU(const S: UnicodeString; const Count: Integer): UnicodeString;
  991. function CopyRight(const S: String; const Count: Integer): String;
  992. function CopyLeftEllipsedA(const S: AnsiString; const Count: Integer): AnsiString;
  993. { }
  994. { CopyEx }
  995. { }
  996. { CopyEx functions extend Copy so that negative Start/Stop values reference }
  997. { indexes from the end of the string, eg. -2 will reference the second last }
  998. { character in the string. }
  999. { }
  1000. function CopyExA(const S: AnsiString; const Start, Count: Integer): AnsiString;
  1001. function CopyExW(const S: String; const Start, Count: Integer): String;
  1002. function CopyExU(const S: UnicodeString; const Start, Count: Integer): UnicodeString;
  1003. function CopyEx(const S: String; const Start, Count: Integer): String;
  1004. function CopyRangeExA(const S: AnsiString; const Start, Stop: Integer): AnsiString;
  1005. function CopyRangeExW(const S: WideString; const Start, Stop: Integer): WideString;
  1006. function CopyRangeExU(const S: UnicodeString; const Start, Stop: Integer): UnicodeString;
  1007. function CopyRangeEx(const S: String; const Start, Stop: Integer): String;
  1008. function CopyFromExA(const S: AnsiString; const Start: Integer): AnsiString;
  1009. function CopyFromExW(const S: WideString; const Start: Integer): WideString;
  1010. function CopyFromExU(const S: UnicodeString; const Start: Integer): UnicodeString;
  1011. function CopyFromEx(const S: String; const Start: Integer): String;
  1012. { }
  1013. { Trim }
  1014. { }
  1015. function StrTrimLeftA(const S: AnsiString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): AnsiString;
  1016. function StrTrimLeftW(const S: WideString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): WideString; overload;
  1017. function StrTrimLeftW(const S: WideString; const C: TWideCharMatchFunction): WideString; overload;
  1018. function StrTrimLeftU(const S: UnicodeString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): UnicodeString; overload;
  1019. function StrTrimLeftU(const S: UnicodeString; const C: TWideCharMatchFunction): UnicodeString; overload;
  1020. function StrTrimLeft(const S: String; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): String;
  1021. procedure StrTrimLeftInPlaceA(var S: AnsiString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF});
  1022. procedure StrTrimLeftInPlaceW(var S: WideString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}); overload;
  1023. procedure StrTrimLeftInPlaceW(var S: WideString; const C: TWideCharMatchFunction); overload;
  1024. procedure StrTrimLeftInPlaceU(var S: UnicodeString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}); overload;
  1025. procedure StrTrimLeftInPlaceU(var S: UnicodeString; const C: TWideCharMatchFunction); overload;
  1026. procedure StrTrimLeftInPlace(var S: String; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF});
  1027. function StrTrimLeftStrNoCaseA(const S: AnsiString; const TrimStr: AnsiString): AnsiString;
  1028. function StrTrimLeftStrNoCaseW(const S: WideString; const TrimStr: WideString): WideString;
  1029. function StrTrimLeftStrNoCaseU(const S: UnicodeString; const TrimStr: WideString): UnicodeString;
  1030. function StrTrimLeftStrNoCase(const S: String; const TrimStr: String): String;
  1031. function StrTrimRightA(const S: AnsiString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): AnsiString;
  1032. function StrTrimRightW(const S: WideString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): WideString; overload;
  1033. function StrTrimRightW(const S: WideString; const C: TWideCharMatchFunction): WideString; overload;
  1034. function StrTrimRightU(const S: UnicodeString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): UnicodeString; overload;
  1035. function StrTrimRightU(const S: UnicodeString; const C: TWideCharMatchFunction): UnicodeString; overload;
  1036. function StrTrimRight(const S: String; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): String;
  1037. procedure StrTrimRightInPlaceA(var S: AnsiString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF});
  1038. procedure StrTrimRightInPlaceW(var S: WideString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}); overload;
  1039. procedure StrTrimRightInPlaceW(var S: WideString; const C: TWideCharMatchFunction); overload;
  1040. procedure StrTrimRightInPlaceU(var S: UnicodeString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}); overload;
  1041. procedure StrTrimRightInPlaceU(var S: UnicodeString; const C: TWideCharMatchFunction); overload;
  1042. procedure StrTrimRightInPlace(var S: String; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF});
  1043. function StrTrimRightStrNoCaseA(const S: AnsiString; const TrimStr: AnsiString): AnsiString;
  1044. function StrTrimRightStrNoCaseW(const S: WideString; const TrimStr: WideString): WideString;
  1045. function StrTrimRightStrNoCaseU(const S: UnicodeString; const TrimStr: UnicodeString): UnicodeString;
  1046. function StrTrimRightStrNoCase(const S: String; const TrimStr: String): String;
  1047. function StrTrimA(const S: AnsiString; const C: CharSet): AnsiString;
  1048. function StrTrimW(const S: WideString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): WideString; overload;
  1049. function StrTrimW(const S: WideString; const C: TWideCharMatchFunction): WideString; overload;
  1050. function StrTrimU(const S: UnicodeString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}): UnicodeString; overload;
  1051. function StrTrimU(const S: UnicodeString; const C: TWideCharMatchFunction): UnicodeString; overload;
  1052. function StrTrim(const S: String; const C: CharSet): String; overload;
  1053. procedure StrTrimInPlaceA(var S: AnsiString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF});
  1054. procedure StrTrimInPlaceW(var S: WideString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}); overload;
  1055. procedure StrTrimInPlaceW(var S: WideString; const C: TWideCharMatchFunction); overload;
  1056. procedure StrTrimInPlaceU(var S: UnicodeString; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}); overload;
  1057. procedure StrTrimInPlaceU(var S: UnicodeString; const C: TWideCharMatchFunction); overload;
  1058. procedure StrTrimInPlace(var S: String; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF});
  1059. procedure TrimStringsA(var S: AnsiStringArray; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}); overload;
  1060. procedure TrimStringsW(var S: WideStringArray; const C: CharSet{$IFNDEF CLR} = csWhiteSpace{$ENDIF}); overload;
  1061. { }
  1062. { Duplicate }
  1063. { }
  1064. {$IFNDEF ManagedCode}
  1065. function BufToStrA(const Buf; const BufSize: Integer): AnsiString;
  1066. function BufToStrW(const Buf; const BufSize: Integer): WideString;
  1067. function BufToStrU(const Buf; const BufSize: Integer): UnicodeString;
  1068. function BufToStr(const Buf; const BufSize: Integer): String;
  1069. function DupBufA(const Buf; const BufSize: Integer; const Count: Integer): AnsiString;
  1070. function DupBufW(const Buf; const BufSize: Integer; const Count: Integer): WideString;
  1071. function DupBufU(const Buf; const BufSize: Integer; const Count: Integer): UnicodeString;
  1072. function DupBuf(const Buf; const BufSize: Integer; const Count: Integer): String;
  1073. {$ENDIF}
  1074. function DupStrA(const S: AnsiString; const Count: Integer): AnsiString;
  1075. function DupStrW(const S: WideString; const Count: Integer): WideString;
  1076. function DupStrU(const S: UnicodeString; const Count: Integer): UnicodeString;
  1077. function DupStr(const S: String; const Count: Integer): String;
  1078. function DupCharA(const Ch: AnsiChar; const Count: Integer): AnsiString;
  1079. function DupCharW(const Ch: WideChar; const Count: Integer): WideString;
  1080. function DupCharU(const Ch: WideChar; const Count: Integer): UnicodeString;
  1081. function DupChar(const Ch: Char; const Count: Integer): String;
  1082. function DupSpaceA(const Count: Integer): AnsiString;
  1083. function DupSpaceW(const Count: Integer): WideString;
  1084. function DupSpaceU(const Count: Integer): UnicodeString;
  1085. function DupSpace(const Count: Integer): String;
  1086. { }
  1087. { Pad }
  1088. { }
  1089. function StrPadA(const S: AnsiString; const PadChar: AnsiChar; const Len: Integer;
  1090. const Cut: Boolean = False): AnsiString;
  1091. function StrPadW(const S: WideString; const PadChar: WideChar; const Len: Integer;
  1092. const Cut: Boolean = False): WideString;
  1093. function StrPadU(const S: UnicodeString; const PadChar: WideChar; const Len: Integer;
  1094. const Cut: Boolean = False): UnicodeString;
  1095. function StrPad(const S: String; const PadChar: Char; const Len: Integer;
  1096. const Cut: Boolean = False): String;
  1097. function StrPadLeftA(const S: AnsiString; const PadChar: AnsiChar;
  1098. const Len: Integer; const Cut: Boolean = False): AnsiString;
  1099. function StrPadLeftW(const S: WideString; const PadChar: WideChar;
  1100. const Len: Integer; const Cut: Boolean = False): WideString;
  1101. function StrPadLeftU(const S: UnicodeString; const PadChar: WideChar;
  1102. const Len: Integer; const Cut: Boolean = False): UnicodeString;
  1103. function StrPadLeft(const S: String; const PadChar: Char;
  1104. const Len: Integer; const Cut: Boolean = False): String;
  1105. function StrPadRightA(const S: AnsiString; const PadChar: AnsiChar;
  1106. const Len: Integer; const Cut: Boolean = False): AnsiString;
  1107. function StrPadRightW(const S: WideString; const PadChar: WideChar;
  1108. const Len: Integer; const Cut: Boolean = False): WideString;
  1109. function StrPadRightU(const S: UnicodeString; const PadChar: WideChar;
  1110. const Len: Integer; const Cut: Boolean = False): UnicodeString;
  1111. function StrPadRight(const S: String; const PadChar: Char;
  1112. const Len: Integer; const Cut: Boolean = False): String;
  1113. { }
  1114. { Delimited }
  1115. { }
  1116. function StrBetweenCharA(const S: AnsiString;
  1117. const FirstDelim, SecondDelim: AnsiChar;
  1118. const FirstOptional: Boolean = False;
  1119. const SecondOptional: Boolean = False): AnsiString; overload;
  1120. function StrBetweenCharA(const S: AnsiString;
  1121. const FirstDelim, SecondDelim: CharSet;
  1122. const FirstOptional: Boolean = False;
  1123. const SecondOptional: Boolean = False): AnsiString; overload;
  1124. function StrBetweenCharW(const S: WideString;
  1125. const FirstDelim, SecondDelim: WideChar;
  1126. const FirstOptional: Boolean = False;
  1127. const SecondOptional: Boolean = False): WideString; overload;
  1128. function StrBetweenCharW(const S: WideString;
  1129. const FirstDelim, SecondDelim: CharSet;
  1130. const FirstOptional: Boolean = False;
  1131. const SecondOptional: Boolean = False): WideString; overload;
  1132. function StrBetweenChar(const S: String;
  1133. const FirstDelim, SecondDelim: Char;
  1134. const FirstOptional: Boolean = False;
  1135. const SecondOptional: Boolean = False): String; overload;
  1136. function StrBetweenChar(const S: String;
  1137. const FirstDelim, SecondDelim: CharSet;
  1138. const FirstOptional: Boolean = False;
  1139. const SecondOptional: Boolean = False): String; overload;
  1140. function StrBetweenA(const S: AnsiString;
  1141. const FirstDelim: AnsiString; const SecondDelim: CharSet;
  1142. const FirstOptional: Boolean = False;
  1143. const SecondOptional: Boolean = False;
  1144. const FirstDelimAsciiCaseSensitive: Boolean = True): AnsiString; overload;
  1145. function StrBetweenA(const S: AnsiString;
  1146. const FirstDelim, SecondDelim: AnsiString;
  1147. const FirstOptional: Boolean = False;
  1148. const SecondOptional: Boolean = False;
  1149. const FirstDelimAsciiCaseSensitive: Boolean = True;
  1150. const SecondDelimAsciiCaseSensitive: Boolean = True): AnsiString; overload;
  1151. function StrBetweenW(const S: WideString;
  1152. const FirstDelim: WideString; const SecondDelim: CharSet;
  1153. const FirstOptional: Boolean = False;
  1154. const SecondOptional: Boolean = False;
  1155. const FirstDelimAsciiCaseSensitive: Boolean = True): WideString; overload;
  1156. function StrBetweenW(const S: WideString;
  1157. const FirstDelim, SecondDelim: WideString;
  1158. const FirstOptional: Boolean = False;
  1159. const SecondOptional: Boolean = False;
  1160. const FirstDelimAsciiCaseSensitive: Boolean = True;
  1161. const SecondDelimAsciiCaseSensitive: Boolean = True): WideString; overload;
  1162. function StrBetween(const S: String;
  1163. const FirstDelim: String; const SecondDelim: CharSet;
  1164. const FirstOptional: Boolean = False;
  1165. const SecondOptional: Boolean = False;
  1166. const FirstDelimAsciiCaseSensitive: Boolean = True): String; overload;
  1167. function StrBetween(const S: String;
  1168. const FirstDelim, SecondDelim: String;
  1169. const FirstOptional: Boolean = False;
  1170. const SecondOptional: Boolean = False;
  1171. const FirstDelimAsciiCaseSensitive: Boolean = True;
  1172. const SecondDelimAsciiCaseSensitive: Boolean = True): String; overload;
  1173. function StrBeforeA(const S, D: AnsiString;
  1174. const Optional: Boolean = True;
  1175. const AsciiCaseSensitive: Boolean = True): AnsiString;
  1176. function StrBeforeRevA(const S, D: AnsiString;
  1177. const Optional: Boolean = True;
  1178. const AsciiCaseSensitive: Boolean = True): AnsiString;
  1179. function StrBeforeW(const S, D: WideString;
  1180. const Optional: Boolean = True;
  1181. const AsciiCaseSensitive: Boolean = True): WideString;
  1182. function StrBeforeRevW(const S, D: WideString;
  1183. const Optional: Boolean = True;
  1184. const AsciiCaseSensitive: Boolean = True): WideString;
  1185. function StrBefore(const S, D: String;
  1186. const Optional: Boolean = True;
  1187. const AsciiCaseSensitive: Boolean = True): String;
  1188. function StrBeforeRev(const S, D: String;
  1189. const Optional: Boolean = True;
  1190. const AsciiCaseSensitive: Boolean = True): String;
  1191. function StrBeforeCharA(const S: AnsiString; const D: AnsiChar; const Optional: Boolean = True): AnsiString; overload;
  1192. function StrBeforeCharA(const S: AnsiString; const D: CharSet; const Optional: Boolean = True): AnsiString; overload;
  1193. function StrBeforeCharRevA(const S: AnsiString; const D: CharSet; const Optional: Boolean = True): AnsiString;
  1194. function StrBeforeCharW(const S: WideString; const D: WideChar; const Optional: Boolean = True): WideString; overload;
  1195. function StrBeforeCharW(const S: WideString; const D: CharSet; const Optional: Boolean = True): WideString; overload;
  1196. function StrBeforeCharRevW(const S: WideString; const D: CharSet; const Optional: Boolean = True): WideString;
  1197. function StrBeforeChar(const S: String; const D: Char; const Optional: Boolean = True): String; overload;
  1198. function StrBeforeChar(const S: String; const D: CharSet; const Optional: Boolean = True): String; overload;
  1199. function StrBeforeCharRev(const S: String; const D: CharSet; const Optional: Boolean = True): String;
  1200. function StrAfterA(const S, D: AnsiString; const Optional: Boolean = False): AnsiString;
  1201. function StrAfterRevA(const S, D: AnsiString; const Optional: Boolean = False): AnsiString;
  1202. function StrAfterW(const S, D: WideString; const Optional: Boolean = False): WideString;
  1203. function StrAfterRevW(const S, D: WideString; const Optional: Boolean = False): WideString;
  1204. function StrAfter(const S, D: String; const Optional: Boolean = False): String;
  1205. function StrAfterRev(const S, D: String; const Optional: Boolean = False): String;
  1206. function StrAfterCharA(const S: AnsiString; const D: CharSet): AnsiString; overload;
  1207. function StrAfterCharA(const S: AnsiString; const D: AnsiChar): AnsiString; overload;
  1208. function StrAfterCharW(const S: WideString; const D: CharSet): WideString; overload;
  1209. function StrAfterCharW(const S: WideString; const D: WideChar): WideString; overload;
  1210. function StrAfterChar(const S: String; const D: CharSet): String; overload;
  1211. function StrAfterChar(const S: String; const D: Char): String; overload;
  1212. function StrCopyToCharA(const S: AnsiString; const D: CharSet;
  1213. const Optional: Boolean = True): AnsiString; overload;
  1214. function StrCopyToCharA(const S: AnsiString; const D: AnsiChar;
  1215. const Optional: Boolean = True): AnsiString; overload;
  1216. function StrCopyToCharW(const S: WideString; const D: CharSet;
  1217. const Optional: Boolean = True): WideString; overload;
  1218. function StrCopyToCharW(const S: WideString; const D: WideChar;
  1219. const Optional: Boolean = True): WideString; overload;
  1220. function StrCopyToChar(const S: String; const D: CharSet;
  1221. const Optional: Boolean = True): String; overload;
  1222. function StrCopyToChar(const S: String; const D: Char;
  1223. const Optional: Boolean = True): String; overload;
  1224. function StrCopyFromCharA(const S: AnsiString; const D: CharSet): AnsiString; overload;
  1225. function StrCopyFromCharA(const S: AnsiString; const D: AnsiChar): AnsiString; overload;
  1226. function StrCopyFromCharW(const S: WideString; const D: CharSet): WideString; overload;
  1227. function StrCopyFromCharW(const S: WideString; const D: WideChar): WideString; overload;
  1228. function StrCopyFromChar(const S: String; const D: CharSet): String; overload;
  1229. function StrCopyFromChar(const S: String; const D: Char): String; overload;
  1230. function StrRemoveCharDelimitedA(var S: AnsiString;
  1231. const FirstDelim, SecondDelim: AnsiChar): AnsiString;
  1232. function StrRemoveCharDelimitedW(var S: WideString;
  1233. const FirstDelim, SecondDelim: WideChar): WideString;
  1234. function StrRemoveCharDelimited(var S: String;
  1235. const FirstDelim, SecondDelim: Char): String;
  1236. { }
  1237. { Count }
  1238. { }
  1239. function StrCountCharA(const S: AnsiString; const C: AnsiChar): Integer; overload;
  1240. function StrCountCharW(const S: WideString; const C: WideChar): Integer; overload;
  1241. function StrCountCharU(const S: UnicodeString; const C: WideChar): Integer; overload;
  1242. function StrCountChar(const S: String; const C: Char): Integer; overload;
  1243. function StrCountCharA(const S: AnsiString; const C: CharSet): Integer; overload;
  1244. function StrCountCharW(const S: WideString; const C: CharSet): Integer; overload;
  1245. function StrCountCharU(const S: UnicodeString; const C: CharSet): Integer; overload;
  1246. function StrCountChar(const S: String; const C: CharSet): Integer; overload;
  1247. { }
  1248. { Replace }
  1249. { }
  1250. function StrReplaceCharA(const Find, Replace: AnsiChar; const S: AnsiString): AnsiString; overload;
  1251. function StrReplaceCharW(const Find, Replace: WideChar; const S: WideString): WideString; overload;
  1252. function StrReplaceCharU(const Find, Replace: WideChar; const S: UnicodeString): UnicodeString; overload;
  1253. function StrReplaceChar(const Find, Replace: Char; const S: String): String; overload;
  1254. function StrReplaceCharA(const Find: CharSet; const Replace: AnsiChar; const S: AnsiString): AnsiString; overload;
  1255. function StrReplaceCharW(const Find: CharSet; const Replace: WideChar; const S: WideString): WideString; overload;
  1256. function StrReplaceCharU(const Find: CharSet; const Replace: WideChar; const S: UnicodeString): UnicodeString; overload;
  1257. function StrReplaceChar(const Find: CharSet; const Replace: Char; const S: String): String; overload;
  1258. function StrReplaceA(const Find, Replace, S: AnsiString; const AsciiCaseSensitive: Boolean = True): AnsiString; overload;
  1259. function StrReplaceW(const Find, Replace, S: WideString; const AsciiCaseSensitive: Boolean = True): WideString; overload;
  1260. function StrReplaceU(const Find, Replace, S: UnicodeString; const AsciiCaseSensitive: Boolean = True): UnicodeString; overload;
  1261. function StrReplace(const Find, Replace, S: String; const AsciiCaseSensitive: Boolean = True): String; overload;
  1262. {$IFNDEF CLR}
  1263. function StrReplaceA(const Find: CharSet; const Replace, S: AnsiString): AnsiString; overload;
  1264. function StrReplaceW(const Find: CharSet; const Replace, S: WideString): WideString; overload;
  1265. function StrReplaceU(const Find: CharSet; const Replace, S: UnicodeString): UnicodeString; overload;
  1266. function StrReplace(const Find: CharSet; const Replace, S: String): String; overload;
  1267. function StrReplaceCharStrA(const Find: AnsiChar; const Replace, S: AnsiString): AnsiString;
  1268. function StrReplaceCharStrW(const Find: WideChar; const Replace, S: WideString): WideString;
  1269. function StrReplaceCharStrU(const Find: WideChar; const Replace, S: UnicodeString): UnicodeString;
  1270. {$ENDIF}
  1271. function StrRemoveDupA(const S: AnsiString; const C: AnsiChar): AnsiString;
  1272. function StrRemoveDupW(const S: WideString; const C: WideChar): WideString;
  1273. function StrRemoveDupU(const S: UnicodeString; const C: WideChar): UnicodeString;
  1274. function StrRemoveDup(const S: String; const C: Char): String;
  1275. function StrRemoveCharA(const S: AnsiString; const C: AnsiChar): AnsiString;
  1276. function StrRemoveCharW(const S: WideString; const C: WideChar): WideString;
  1277. function StrRemoveCharU(const S: UnicodeString; const C: WideChar): UnicodeString;
  1278. function StrRemoveChar(const S: String; const C: Char): String;
  1279. {$IFNDEF CLR}
  1280. function StrRemoveCharSetA(const S: AnsiString; const C: CharSet): AnsiString;
  1281. function StrRemoveCharSetW(const S: WideString; const C: CharSet): WideString;
  1282. function StrRemoveCharSetU(const S: UnicodeString; const C: CharSet): UnicodeString;
  1283. function StrRemoveCharSet(const S: String; const C: CharSet): String;
  1284. {$ENDIF}
  1285. { }
  1286. { Split }
  1287. { }
  1288. function StrSplitAtA(const S: AnsiString; const C: AnsiString;
  1289. var Left, Right: AnsiString;
  1290. const AsciiCaseSensitive: Boolean = True;
  1291. const Optional: Boolean = True): Boolean;
  1292. function StrSplitAtW(const S: WideString; const C: WideString;
  1293. var Left, Right: WideString;
  1294. const AsciiCaseSensitive: Boolean = True;
  1295. const Optional: Boolean = True): Boolean;
  1296. function StrSplitAtU(const S: UnicodeString; const C: UnicodeString;
  1297. var Left, Right: UnicodeString;
  1298. const AsciiCaseSensitive: Boolean = True;
  1299. const Optional: Boolean = True): Boolean;
  1300. function StrSplitAt(const S: String; const C: String;
  1301. var Left, Right: String;
  1302. const AsciiCaseSensitive: Boolean = True;
  1303. const Optional: Boolean = True): Boolean;
  1304. function StrSplitAtCharA(const S: AnsiString; const C: AnsiChar;
  1305. var Left, Right: AnsiString;
  1306. const Optional: Boolean = True): Boolean;
  1307. function StrSplitAtCharW(const S: WideString; const C: WideChar;
  1308. var Left, Right: WideString;
  1309. const Optional: Boolean = True): Boolean;
  1310. function StrSplitAtCharU(const S: UnicodeString; const C: WideChar;
  1311. var Left, Right: UnicodeString;
  1312. const Optional: Boolean = True): Boolean;
  1313. function StrSplitAtChar(const S: String; const C: Char;
  1314. var Left, Right: String;
  1315. const Optional: Boolean = True): Boolean;
  1316. function StrSplitAtCharSetA(const S: AnsiString; const C: CharSet;
  1317. var Left, Right: AnsiString;
  1318. const Optional: Boolean = True): Boolean;
  1319. function StrSplitA(const S, D: AnsiString): AnsiStringArray;
  1320. function StrSplitW(const S, D: WideString): WideStringArray;
  1321. function StrSplitU(const S, D: UnicodeString): UnicodeStringArray;
  1322. function StrSplit(const S, D: String): StringArray;
  1323. function StrSplitCharA(const S: AnsiString; const D: AnsiChar): AnsiStringArray;
  1324. function StrSplitCharW(const S: WideString; const D: WideChar): WideStringArray;
  1325. function StrSplitCharU(const S: UnicodeString; const D: WideChar): UnicodeStringArray;
  1326. function StrSplitChar(const S: String; const D: Char): StringArray;
  1327. function StrSplitCharSetA(const S: AnsiString; const D: CharSet): AnsiStringArray;
  1328. function StrSplitCharSetW(const S: WideString; const D: CharSet): WideStringArray;
  1329. function StrSplitCharSetU(const S: UnicodeString; const D: CharSet): UnicodeStringArray;
  1330. function StrSplitCharSet(const S: String; const D: CharSet): StringArray;
  1331. {$IFNDEF CLR}
  1332. function StrSplitWords(const S: AnsiString; const C: CharSet): AnsiStringArray;
  1333. {$ENDIF}
  1334. function StrJoinA(const S: array of AnsiString; const D: AnsiString): AnsiString;
  1335. function StrJoinW(const S: array of WideString; const D: WideString): WideString;
  1336. function StrJoinU(const S: array of UnicodeString; const D: UnicodeString): UnicodeString;
  1337. function StrJoin(const S: array of String; const D: String): String;
  1338. function StrJoinCharA(const S: array of AnsiString; const D: AnsiChar): AnsiString;
  1339. function StrJoinCharW(const S: array of WideString; const D: WideChar): WideString;
  1340. function StrJoinCharU(const S: array of UnicodeString; const D: WideChar): UnicodeString;
  1341. function StrJoinChar(const S: array of String; const D: Char): String;
  1342. { }
  1343. { Quoting }
  1344. { }
  1345. { QuoteText, UnquoteText converts text where the string is enclosed in a }
  1346. { pair of the same quote characters, and two consequetive occurance of the }
  1347. { quote character inside the quotes indicate a quote character in the text. }
  1348. { Examples: }
  1349. { }
  1350. { StrQuote ('abc', '"') = '"abc"' }
  1351. { StrQuote ('a"b"c', '"') = '"a""b""c"' }
  1352. { StrUnquote ('"a""b""c"') = 'a"b"c' }
  1353. { }
  1354. function StrHasSurroundingQuotesA(const S: AnsiString;
  1355. const Quotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): Boolean;
  1356. function StrHasSurroundingQuotesW(const S: WideString;
  1357. const Quotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): Boolean;
  1358. function StrHasSurroundingQuotesU(const S: UnicodeString;
  1359. const Quotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): Boolean;
  1360. function StrHasSurroundingQuotes(const S: String;
  1361. const Quotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): Boolean;
  1362. function StrRemoveSurroundingQuotesA(const S: AnsiString;
  1363. const Quotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): AnsiString;
  1364. function StrRemoveSurroundingQuotesW(const S: WideString;
  1365. const Quotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): WideString;
  1366. function StrRemoveSurroundingQuotesU(const S: UnicodeString;
  1367. const Quotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): UnicodeString;
  1368. function StrRemoveSurroundingQuotes(const S: String;
  1369. const Quotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): String;
  1370. function StrQuoteA(const S: AnsiString; const Quote: AnsiChar = '"'): AnsiString;
  1371. function StrQuoteW(const S: WideString; const Quote: WideChar = '"'): WideString;
  1372. function StrQuoteU(const S: UnicodeString; const Quote: WideChar = '"'): UnicodeString;
  1373. function StrQuote(const S: String; const Quote: Char = '"'): String;
  1374. function StrUnquoteA(const S: AnsiString): AnsiString;
  1375. function StrUnquoteW(const S: WideString): WideString;
  1376. function StrUnquoteU(const S: UnicodeString): UnicodeString;
  1377. function StrUnquote(const S: String): String;
  1378. function StrMatchQuotedStrA(const S: AnsiString;
  1379. const ValidQuotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF};
  1380. const Index: Integer = 1): Integer;
  1381. function StrIsQuotedStrA(const S: AnsiString;
  1382. const ValidQuotes: CharSet{$IFNDEF CLR} = csQuotes{$ENDIF}): Boolean;
  1383. function StrFindClosingQuoteA(const S: AnsiString;
  1384. const OpenQuotePos: Integer): Integer;
  1385. { }
  1386. { Bracketing }
  1387. { }
  1388. function StrFindClosingBracketA(const S: AnsiString;
  1389. const OpenBracketPos: Integer; const CloseBracket: AnsiChar): Integer;
  1390. { }
  1391. { Escaping }
  1392. { }
  1393. function StrHexEscape(const S: AnsiString; const C: CharSet;
  1394. const EscPrefix: AnsiString = '\x'; const EscSuffix: AnsiString = '';
  1395. const UpperHex: Boolean = True;
  1396. const TwoDigitHex: Boolean = True): AnsiString;
  1397. function StrHexUnescape(const S: AnsiString; const EscPrefix: AnsiString = '\x';
  1398. const AsciiCaseSensitive: Boolean = True): AnsiString;
  1399. function StrCharEscape(const S: AnsiString; const C: array of AnsiChar;
  1400. const EscPrefix: AnsiString;
  1401. const EscSeq: array of AnsiString): AnsiString;
  1402. function StrCharUnescape(const S: AnsiString; const EscPrefix: AnsiString;
  1403. const C: array of AnsiChar; const Replace: array of AnsiString;
  1404. const PrefixAsciiCaseSensitive: Boolean = True;
  1405. const AlwaysDropPrefix: Boolean = True): AnsiString;
  1406. function StrCStyleEscape(const S: AnsiString): AnsiString;
  1407. function StrCStyleUnescape(const S: AnsiString): AnsiString;
  1408. { }
  1409. { Prefix and Suffix }
  1410. { }
  1411. function StrInclPrefixA(const S: AnsiString; const Prefix: AnsiString; const AsciiCaseSensitive: Boolean = True): AnsiString;
  1412. function StrInclPrefixW(const S: WideString; const Prefix: WideString; const AsciiCaseSensitive: Boolean = True): WideString;
  1413. function StrInclPrefixU(const S: UnicodeString; const Prefix: UnicodeString; const AsciiCaseSensitive: Boolean = True): UnicodeString;
  1414. function StrInclPrefix(const S: String; const Prefix: String; const AsciiCaseSensitive: Boolean = True): String;
  1415. function StrInclSuffixA(const S: AnsiString; const Suffix: AnsiString; const AsciiCaseSensitive: Boolean = True): AnsiString;
  1416. function StrInclSuffixW(const S: WideString; const Suffix: WideString; const AsciiCaseSensitive: Boolean = True): WideString;
  1417. function StrInclSuffixU(const S: UnicodeString; const Suffix: UnicodeString; const AsciiCaseSensitive: Boolean = True): UnicodeString;
  1418. function StrInclSuffix(const S: String; const Suffix: String; const AsciiCaseSensitive: Boolean = True): String;
  1419. function StrExclPrefixA(const S: AnsiString; const Prefix: AnsiString; const AsciiCaseSensitive: Boolean = True): AnsiString;
  1420. function StrExclPrefixW(const S: WideString; const Prefix: WideString; const AsciiCaseSensitive: Boolean = True): WideString;
  1421. function StrExclPrefixU(const S: UnicodeString; const Prefix: UnicodeString; const AsciiCaseSensitive: Boolean = True): UnicodeString;
  1422. function StrExclPrefix(const S: String; const Prefix: String; const AsciiCaseSensitive: Boolean = True): String;
  1423. function StrExclSuffixA(const S: AnsiString; const Suffix: AnsiString; const AsciiCaseSensitive: Boolean = True): AnsiString;
  1424. function StrExclSuffixW(const S: WideString; const Suffix: WideString; const AsciiCaseSensitive: Boolean = True): WideString;
  1425. function StrExclSuffixU(const S: UnicodeString; const Suffix: UnicodeString; const AsciiCaseSensitive: Boolean = True): UnicodeString;
  1426. function StrExclSuffix(const S: String; const Suffix: String; const AsciiCaseSensitive: Boolean = True): String;
  1427. procedure StrEnsurePrefixA(var S: AnsiString; const Prefix: AnsiString; const AsciiCaseSensitive: Boolean = True);
  1428. procedure StrEnsurePrefixW(var S: WideString; const Prefix: WideString; const AsciiCaseSensitive: Boolean = True);
  1429. procedure StrEnsurePrefixU(var S: UnicodeString; const Prefix: UnicodeString; const AsciiCaseSensitive: Boolean = True);
  1430. procedure StrEnsurePrefix(var S: String; const Prefix: String; const AsciiCaseSensitive: Boolean = True);
  1431. procedure StrEnsureSuffixA(var S: AnsiString; const Suffix: AnsiString; const AsciiCaseSensitive: Boolean = True);
  1432. procedure StrEnsureSuffixW(var S: WideString; const Suffix: WideString; const AsciiCaseSensitive: Boolean = True);
  1433. procedure StrEnsureSuffixU(var S: UnicodeString; const Suffix: UnicodeString; const AsciiCaseSensitive: Boolean = True);
  1434. procedure StrEnsureSuffix(var S: String; const Suffix: String; const AsciiCaseSensitive: Boolean = True);
  1435. procedure StrEnsureNoPrefixA(var S: AnsiString; const Prefix: AnsiString; const AsciiCaseSensitive: Boolean = True);
  1436. procedure StrEnsureNoPrefixW(var S: WideString; const Prefix: WideString; const AsciiCaseSensitive: Boolean = True);
  1437. procedure StrEnsureNoPrefixU(var S: UnicodeString; const Prefix: UnicodeString; const AsciiCaseSensitive: Boolean = True);
  1438. procedure StrEnsureNoPrefix(var S: String; const Prefix: String; const AsciiCaseSensitive: Boolean = True);
  1439. procedure StrEnsureNoSuffixA(var S: AnsiString; const Suffix: AnsiString; const AsciiCaseSensitive: Boolean = True);
  1440. procedure StrEnsureNoSuffixW(var S: WideString; const Suffix: WideString; const AsciiCaseSensitive: Boolean = True);
  1441. procedure StrEnsureNoSuffixU(var S: UnicodeString; const Suffix: UnicodeString; const AsciiCaseSensitive: Boolean = True);
  1442. procedure StrEnsureNoSuffix(var S: String; const Suffix: String; const AsciiCaseSensitive: Boolean = True);
  1443. { }
  1444. { Reverse }
  1445. { }
  1446. function StrReverseA(const S: AnsiString): AnsiString;
  1447. function StrReverseW(const S: WideString): WideString;
  1448. function StrReverseU(const S: UnicodeString): UnicodeString;
  1449. function StrReverse(const S: String): String;
  1450. { }
  1451. { Base conversion }
  1452. { }
  1453. function BinToLongWord(const S: AnsiString): LongWord;
  1454. function OctToLongWord(const S: AnsiString): LongWord;
  1455. function StrToLongWord(const S: AnsiString): LongWord;
  1456. function StrToLongWordDef(const S: AnsiString; const Default: LongWord): LongWord;
  1457. function HexToLongWord(const S: AnsiString): LongWord;
  1458. function HexToLongWordDef(const S: AnsiString; const Default: LongWord): LongWord;
  1459. { }
  1460. { Type conversion }
  1461. { }
  1462. function StrToFloatDef(const S: String; const Default: Extended): Extended;
  1463. function BooleanToStrA(const B: Boolean): AnsiString;
  1464. function BooleanToStrW(const B: Boolean): WideString;
  1465. function BooleanToStrU(const B: Boolean): UnicodeString;
  1466. function BooleanToStr(const B: Boolean): String;
  1467. function StrToBooleanA(const S: AnsiString): Boolean;
  1468. function StrToBooleanW(const S: WideString): Boolean;
  1469. function StrToBooleanU(const S: UnicodeString): Boolean;
  1470. function StrToBoolean(const S: String): Boolean;
  1471. { }
  1472. { Fast abbreviated regular expression matcher }
  1473. { }
  1474. { Matches regular expressions of the form: (<charset><quant>)* }
  1475. { where <charset> is a character set and <quant> is one of the quantifiers }
  1476. { (mnOnce, mnOptional = ?, mnAny = *, mnLeastOnce = +). }
  1477. { }
  1478. { Supports deterministic/non-deterministic, greedy/non-greedy matching. }
  1479. { Returns first MatchPos (as opposed to longest). }
  1480. { Uses an NFA (Non-deterministic Finite Automata). }
  1481. { }
  1482. { For example: }
  1483. { I := 1 }
  1484. { S := 'a123' }
  1485. { MatchQuantSeq(I, [['a'..'z'], ['0'..9']], [mqOnce, mqAny], S) = True }
  1486. { }
  1487. { is the same as matching the regular expression [a-z][0-9]* }
  1488. { }
  1489. {$IFNDEF CLR}
  1490. type
  1491. TMatchQuantifier = (
  1492. mqOnce,
  1493. mqAny,
  1494. mqLeastOnce,
  1495. mqOptional);
  1496. TMatchQuantSeqOptions = Set of (
  1497. moDeterministic,
  1498. moNonGreedy);
  1499. function MatchQuantSeq(var MatchPos: Integer;
  1500. const MatchSeq: array of CharSet; const Quant: array of TMatchQuantifier;
  1501. const S: AnsiString; const MatchOptions: TMatchQuantSeqOptions = [];
  1502. const StartIndex: Integer = 1; const StopIndex: Integer = -1): Boolean;
  1503. {$ENDIF}
  1504. { }
  1505. { File Mask Matcher }
  1506. { }
  1507. { Matches classic file mask type regular expressions. }
  1508. { ? = matches one character (or zero if at end of mask) }
  1509. { * = matches zero or more characters }
  1510. { }
  1511. function MatchFileMaskA(const Mask, Key: AnsiString;
  1512. const AsciiCaseSensitive: Boolean = False): Boolean;
  1513. { }
  1514. { Character class strings }
  1515. { }
  1516. { Perl-like character class string representation of character sets, eg }
  1517. { the set ['0', 'A'..'Z'] is presented as [0A-Z]. Negated classes are also }
  1518. { supported, eg '[^A-Za-z]' is all non-alpha characters. The empty and }
  1519. { complete sets have special representations; '[]' and '.' respectively. }
  1520. { }
  1521. function CharSetToCharClassStr(const C: CharSet): AnsiString;
  1522. {$IFNDEF CLR}
  1523. function CharClassStrToCharSet(const S: AnsiString): CharSet;
  1524. {$ENDIF}
  1525. { }
  1526. { Dynamic array functions }
  1527. { }
  1528. function StringsTotalLengthA(const S: array of AnsiString): Integer;
  1529. function StringsTotalLengthW(const S: array of WideString): Integer;
  1530. function StringsTotalLengthU(const S: array of UnicodeString): Integer;
  1531. function StringsTotalLength(const S: array of String): Integer;
  1532. function PosNextNoCase(const Find: AnsiString; const V: array of AnsiString;
  1533. const PrevPos: Integer = -1;
  1534. const IsSortedAscending: Boolean = False): Integer;
  1535. { }
  1536. { Natural language }
  1537. { }
  1538. function StorageSize(const Bytes: Int64;
  1539. const ShortFormat: Boolean = False): String;
  1540. function TransferRate(const Bytes, MillisecondsElapsed: Int64;
  1541. const ShortFormat: Boolean = False): String;
  1542. {$IFNDEF ManagedCode}
  1543. { }
  1544. { String Builder }
  1545. { }
  1546. { Class to help construct a string. }
  1547. { The String Builder class is used to efficiently construct a long string }
  1548. { from multiple shorter strings. }
  1549. { }
  1550. type
  1551. TAnsiStringBuilder = class
  1552. protected
  1553. FString : AnsiString;
  1554. FLength : Integer;
  1555. procedure EnsureCapacity(const L: Integer);
  1556. function GetAsAnsiString: AnsiString;
  1557. procedure SetAsAnsiString(const S: AnsiString);
  1558. function GetAsString: String;
  1559. public
  1560. constructor Create(const S: AnsiString = ''); overload;
  1561. constructor Create(const Capacity: Integer); overload;
  1562. property Length: Integer read FLength;
  1563. property AsAnsiString: AnsiString read GetAsAnsiString write SetAsAnsiString;
  1564. property AsString: String read GetAsString;
  1565. procedure Clear;
  1566. procedure Assign(const S: TAnsiStringBuilder);
  1567. procedure Append(const S: AnsiString); overload;
  1568. procedure AppendCRLF;
  1569. procedure AppendLn(const S: AnsiString = '');
  1570. procedure Append(const S: AnsiString; const Count: Integer); overload;
  1571. procedure AppendCh(const C: AnsiChar); overload;
  1572. procedure AppendCh(const C: AnsiChar; const Count: Integer); overload;
  1573. procedure Append(const BufPtr: Pointer; const Size: Integer); overload;
  1574. procedure Append(const S: TAnsiStringBuilder); overload;
  1575. procedure Pack;
  1576. end;
  1577. TWideStringBuilder = class
  1578. protected
  1579. FString : WideString;
  1580. FLength : Integer;
  1581. procedure EnsureCapacity(const L: Integer);
  1582. function GetAsWideString: WideString;
  1583. procedure SetAsWideString(const S: WideString);
  1584. public
  1585. constructor Create(const S: WideString = ''); overload;
  1586. constructor Create(const Capacity: Integer); overload;
  1587. property Length: Integer read FLength;
  1588. property AsWideString: WideString read GetAsWideString write SetAsWideString;
  1589. procedure Clear;
  1590. procedure Assign(const S: TWideStringBuilder);
  1591. procedure Append(const S: WideString); overload;
  1592. procedure AppendLn(const S: WideString = '');
  1593. procedure Append(const S: WideString; const Count: Integer); overload;
  1594. procedure AppendCh(const C: WideChar); overload;
  1595. procedure AppendCh(const C: WideChar; const Count: Integer); overload;
  1596. procedure Append(const S: TWideStringBuilder); overload;
  1597. procedure Pack;
  1598. end;
  1599. TUnicodeStringBuilder = class
  1600. protected
  1601. FString : UnicodeString;
  1602. FLength : Integer;
  1603. procedure EnsureCapacity(const L: Integer);
  1604. function GetAsUnicodeString: UnicodeString;
  1605. procedure SetAsUnicodeString(const S: UnicodeString);
  1606. public
  1607. constructor Create(const S: UnicodeString = ''); overload;
  1608. constructor Create(const Capacity: Integer); overload;
  1609. property Length: Integer read FLength;
  1610. property AsUnicodeString: UnicodeString read GetAsUnicodeString write SetAsUnicodeString;
  1611. procedure Clear;
  1612. procedure Assign(const S: TUnicodeStringBuilder);
  1613. procedure Append(const S: UnicodeString); overload;
  1614. procedure AppendLn(const S: UnicodeString = '');
  1615. procedure Append(const S: UnicodeString; const Count: Integer); overload;
  1616. procedure AppendCh(const C: WideChar); overload;
  1617. procedure AppendCh(const C: WideChar; const Count: Integer); overload;
  1618. procedure Append(const S: TUnicodeStringBuilder); overload;
  1619. procedure Pack;
  1620. end;
  1621. TStringBuilder = class
  1622. protected
  1623. FString : String;
  1624. FLength : Integer;
  1625. procedure EnsureCapacity(const L: Integer);
  1626. function GetAsString: String;
  1627. procedure SetAsString(const S: String);
  1628. public
  1629. constructor Create(const S: String = ''); overload;
  1630. constructor Create(const Capacity: Integer); overload;
  1631. property Length: Integer read FLength;
  1632. property AsString: String read GetAsString write SetAsString;
  1633. procedure Clear;
  1634. procedure Assign(const S: TStringBuilder);
  1635. procedure Append(const S: String); overload;
  1636. procedure AppendLn(const S: String = '');
  1637. procedure Append(const S: String; const Count: Integer); overload;
  1638. procedure AppendCh(const C: Char); overload;
  1639. procedure AppendCh(const C: Char; const Count: Integer); overload;
  1640. procedure Append(const S: TStringBuilder); overload;
  1641. procedure Pack;
  1642. end;
  1643. {$ENDIF}
  1644. { }
  1645. { Test cases }
  1646. { }
  1647. {$IFDEF STRINGS_SELFTEST}
  1648. procedure SelfTest;
  1649. {$ENDIF}
  1650. implementation
  1651. { }
  1652. { Unicode character functions }
  1653. { }
  1654. function UnicodeIsAsciiChar(const Ch: WideChar): Boolean;
  1655. begin
  1656. Result := Ord(Ch) <= $7F;
  1657. end;
  1658. function UnicodeIsWhiteSpace(const Ch: WideChar): Boolean;
  1659. begin
  1660. case Ch of
  1661. #$0009..#$000D, // ASCII CONTROL
  1662. #$0020, // SPACE
  1663. #$0085, // <control>
  1664. #$00A0, // NO-BREAK SPACE
  1665. #$1680, // OGHAM SPACE MARK
  1666. #$2000..#$200A, // EN QUAD..HAIR SPACE
  1667. #$2028, // LINE SEPARATOR
  1668. #$2029, // PARAGRAPH SEPARATOR
  1669. #$202F, // NARROW NO-BREAK SPACE
  1670. #$3000 : // IDEOGRAPHIC SPACE
  1671. Result := True;
  1672. else
  1673. Result := False;
  1674. end;
  1675. end;
  1676. function UnicodeIsControl(const Ch: WideChar): Boolean;
  1677. begin
  1678. case Ch of
  1679. #$0000..#$001F,
  1680. #$007F..#$009F :
  1681. Result := True;
  1682. else
  1683. Result := False;
  1684. end;
  1685. end;
  1686. function UnicodeIsControlOrWhiteSpace(const Ch: WideChar): Boolean;
  1687. begin
  1688. Result := UnicodeIsControl(Ch) or UnicodeIsWhiteSpace(Ch);
  1689. end;
  1690. // Derived from 'Cf' + 'Cc' + 'Cs' - White_Space
  1691. function UnicodeIsIgnorable(const Ch: UCS4Char): Boolean;
  1692. begin
  1693. case Ch of
  1694. $0000..$0008, // # Cc [9] <control>..<control>
  1695. $000E..$001F, // # Cc [18] <control>..<control>
  1696. $007F..$0084, // # Cc [6] <control>..<control>
  1697. $0086..$009F, // # Cc [26] <control>..<control>
  1698. $06DD, // # Cf ARABIC END OF AYAH
  1699. $070F, // # Cf SYRIAC ABBREVIATION MARK
  1700. $180B..$180D, // # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
  1701. $180E, // # Cf MONGOLIAN VOWEL SEPARATOR
  1702. $200C..$200F, // # Cf [4] ZERO WIDTH NON-JOINER..RIGHT-TO-LEFT MARK
  1703. $202A..$202E, // # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
  1704. $2060..$2063, // # Cf [4] WORD JOINER..INVISIBLE SEPARATOR
  1705. $2064..$2069, // # Cn [6]
  1706. $206A..$206F, // # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
  1707. $D800..$DFFF, // # Cs [2048]
  1708. $FE00..$FE0F, // # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
  1709. $FEFF, // # Cf ZERO WIDTH NO-BREAK SPACE
  1710. $FFF0..$FFF8, // # Cn [9]
  1711. $FFF9..$FFFB, // # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
  1712. $1D173..$1D17A, // # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
  1713. $E0000, // # Cn
  1714. $E0001, // # Cf LANGUAGE TAG
  1715. $E0002..$E001F, // # Cn [30]
  1716. $E0020..$E007F, // # Cf [96] TAG SPACE..CANCEL TAG
  1717. $E0080..$E0FFF : // # Cn [3968]
  1718. Result := True;
  1719. else
  1720. Result := False;
  1721. end;
  1722. end;
  1723. function UnicodeIsDash(const Ch: WideChar): Boolean;
  1724. begin
  1725. case Ch of
  1726. #$002D, // HYPHEN-MINUS
  1727. #$00AD, // SOFT HYPHEN
  1728. #$058A, // ARMENIAN HYPHEN
  1729. #$1806, // MONGOLIAN TODO SOFT HYPHEN
  1730. #$2010..#$2015, // HYPHEN..HORIZONTAL BAR
  1731. #$207B, // SUPERSCRIPT MINUS
  1732. #$208B, // SUBSCRIPT MINUS
  1733. #$2212, // MINUS SIGN
  1734. #$301C, // WAVE DASH
  1735. #$3030, // WAVY DASH
  1736. #$FE31..#$FE32, // PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
  1737. #$FE58, // SMALL EM DASH
  1738. #$FE63, // SMALL HYPHEN-MINUS
  1739. #$FF0D : // FULLWIDTH HYPHEN-MINUS
  1740. Result := True;
  1741. else
  1742. Result := False;
  1743. end;
  1744. end;
  1745. function UnicodeIsHyphen(const Ch: WideChar): Boolean;
  1746. begin
  1747. case Ch of
  1748. #$002D, // HYPHEN-MINUS
  1749. #$00AD, // SOFT HYPHEN
  1750. #$058A, // ARMENIAN HYPHEN
  1751. #$1806, // MONGOLIAN TODO SOFT HYPHEN
  1752. #$2010..#$2011, // HYPHEN..NON-BREAKING HYPHEN
  1753. #$30FB, // KATAKANA MIDDLE DOT
  1754. #$FE63, // SMALL HYPHEN-MINUS
  1755. #$FF0D, // FULLWIDTH HYPHEN-MINUS
  1756. #$FF65 : // HALFWIDTH KATAKANA MIDDLE DOT
  1757. Result := True;
  1758. else
  1759. Result := False;
  1760. end;
  1761. end;
  1762. function UnicodeIsFullStop(const Ch: WideChar): Boolean;
  1763. begin
  1764. case Ord(Ch) of
  1765. $002E, // FULL STOP
  1766. $0589, // ARMENIAN FULL STOP
  1767. $06D4, // ARABIC FULL STOP
  1768. $0701, // SYRIAC SUPRALINEAR FULL STOP
  1769. $0702, // SYRIAC SUBLINEAR FULL STOP
  1770. $1362, // ETHIOPIC FULL STOP
  1771. $166E, // CANADIAN SYLLABICS FULL STOP
  1772. $1803, // MONGOLIAN FULL STOP
  1773. $1809, // MONGOLIAN MANCHU FULL STOP
  1774. $3002, // IDEOGRAPHIC FULL STOP
  1775. $FE52, // SMALL FULL STOP
  1776. $FF0E, // FULLWIDTH FULL STOP
  1777. $FF61 : // HALFWIDTH IDEOGRAPHIC FULL STOP
  1778. Result := True;
  1779. else
  1780. Result := False;
  1781. end;
  1782. end;
  1783. function UnicodeIsComma(const Ch: WideChar): Boolean;
  1784. begin
  1785. case Ord(Ch) of
  1786. $002C, // COMMA
  1787. $055D, // ARMENIAN COMMA
  1788. $060C, // ARABIC COMMA
  1789. $0F14, // TIBETAN MARK GTER TSHEG
  1790. $1363, // ETHIOPIC COMMA
  1791. $1802, // MONGOLIAN COMMA
  1792. $1808, // MONGOLIAN MANCHU COMMA
  1793. $3001, // IDEOGRAPHIC COMMA
  1794. $FE50, // SMALL COMMA
  1795. $FE51, // SMALL IDEOGRAPHIC COMMA
  1796. $FF0C, // FULLWIDTH COMMA
  1797. $FF64 : // HALFWIDTH IDEOGRAPHIC COMMA
  1798. Result := True;
  1799. else
  1800. Result := False;
  1801. end;
  1802. end;
  1803. function UnicodeIsExclamationMark(const Ch: WideChar): Boolean;
  1804. begin
  1805. case Ord(Ch) of
  1806. $0021, // EXCLAMATION MARK
  1807. $00A1, // INVERTED EXCLAMATION MARK
  1808. $055C, // ARMENIAN EXCLAMATION MARK
  1809. $203C, // DOUBLE EXCLAMATION MARK
  1810. $203D, // INTERROBANG
  1811. $2048, // QUESTION EXCLAMATION MARK
  1812. $2049, // EXCLAMATION QUESTION MARK
  1813. $FE57, // SMALL EXCLAMATION MARK
  1814. $FF01 : // FULLWIDTH EXCLAMATION MARK
  1815. Result := True;
  1816. else
  1817. Result := False;
  1818. end;
  1819. end;
  1820. function UnicodeIsQuestionMark(const Ch: WideChar): Boolean;
  1821. begin
  1822. case Ord(Ch) of
  1823. $003F, // QUESTION MARK
  1824. $00BF, // INVERTED QUESTION MARK
  1825. $037E, // GREEK QUESTION MARK
  1826. $055E, // ARMENIAN QUESTION MARK
  1827. $061F, // ARABIC QUESTION MARK
  1828. $1367, // ETHIOPIC QUESTION MARK
  1829. $2049, // EXCLAMATION QUESTION MARK
  1830. $FE56, // SMALL QUESTION MARK
  1831. $FF1F : // FULLWIDTH QUESTION MARK
  1832. Result := True;
  1833. else
  1834. Result := False;
  1835. end;
  1836. end;
  1837. function UnicodeGetRightParenthesis(const LeftParenthesis: WideChar): WideChar;
  1838. begin
  1839. case Ord(LeftParenthesis) of
  1840. $0028 : Result := #$0029; // PARENTHESIS
  1841. $207D : Result := #$207E; // SUPERSCRIPT PARENTHESIS
  1842. $208D : Result := #$208E; // SUBSCRIPT PARENTHESIS
  1843. $FD3E : Result := #$FD3F; // ORNATE PARENTHESIS
  1844. $FE35 : Result := #$FE36; // PRESENTATION FORM FOR VERTICAL PARENTHESIS
  1845. $FE59 : Result := #$FE5A; // SMALL PARENTHESIS
  1846. $FF08 : Result := #$FF09; // FULLWIDTH PARENTHESIS
  1847. else
  1848. Result := #$0000;
  1849. end;
  1850. end;
  1851. function UnicodeIsLeftParenthesis(const Ch: WideChar): Boolean;
  1852. begin
  1853. Result := UnicodeGetRightParenthesis(Ch) <> #$0000;
  1854. end;
  1855. function UnicodeGetRightBracket(const LeftBracket: WideChar): WideChar;
  1856. begin
  1857. case Ord(LeftBracket) of
  1858. $005B : Result := #$005D; // SQUARE BRACKET
  1859. $007B : Result := #$007D; // CURLY BRACKET
  1860. $2045 : Result := #$2046; // SQUARE BRACKET WITH QUILL
  1861. $2329 : Result := #$232A; // POINTING ANGLE BRACKET
  1862. $3008 : Result := #$3009; // ANGLE BRACKET
  1863. $300A : Result := #$300B; // DOUBLE ANGLE BRACKET
  1864. $300C : Result := #$300D; // CORNER BRACKET
  1865. $300E : Result := #$300F; // WHITE CORNER BRACKET
  1866. $3010 : Result := #$3011; // BLACK LENTICULAR BRACKET
  1867. $3014 : Result := #$3015; // TORTOISE SHELL BRACKET
  1868. $3016 : Result := #$3017; // WHITE LENTICULAR BRACKET
  1869. $3018 : Result := #$3019; // WHITE TORTOISE SHELL BRACKET
  1870. $301A : Result := #$301B; // WHITE SQUARE BRACKET
  1871. $FE37 : Result := #$FE38; // PRESENTATION FORM FOR VERTICAL CURLY BRACKET
  1872. $FE39 : Result := #$FE3A; // PRESENTATION FORM FOR VERTICAL TORTOISE SHELL BRACKET
  1873. $FE3B : Result := #$FE3C; // PRESENTATION FORM FOR VERTICAL BLACK LENTICULAR BRACKET
  1874. $FE3D : Result := #$FE3E; // PRESENTATION FORM FOR VERTICAL DOUBLE ANGLE BRACKET
  1875. $FE3F : Result := #$FE40; // PRESENTATION FORM FOR VERTICAL ANGLE BRACKET
  1876. $FE41 : Result := #$FE42; // PRESENTATION FORM FOR VERTICAL CORNER BRACKET
  1877. $FE43 : Result := #$FE44; // PRESENTATION FORM FOR VERTICAL WHITE CORNER BRACKET
  1878. $FE5B : Result := #$FE5C; // SMALL CURLY BRACKET
  1879. $FE5D : Result := #$FE5E; // SMALL TORTOISE SHELL BRACKET
  1880. $FF3B : Result := #$FF3D; // FULLWIDTH SQUARE BRACKET
  1881. $FF5B : Result := #$FF5D; // FULLWIDTH CURLY BRACKET
  1882. $FF62 : Result := #$FF63; // HALFWIDTH CORNER BRACKET
  1883. else
  1884. Result := #$0000;
  1885. end;
  1886. end;
  1887. function UnicodeIsLeftBracket(const Ch: WideChar): Boolean;
  1888. begin
  1889. Result := UnicodeGetRightBracket(Ch) <> #$0000;
  1890. end;
  1891. function UnicodeIsSingularQuotationMark(const Ch: WideChar): Boolean;
  1892. begin
  1893. case Ord(Ch) of
  1894. $0022, // QUOTATION MARK
  1895. $0027, // APOSTROPHE
  1896. $FF02, // FULLWIDTH QUOTATION MARK
  1897. $FF07 : // FULLWIDTH APOSTROPHE
  1898. Result := True;
  1899. else
  1900. Result := False;
  1901. end;
  1902. end;
  1903. function UnicodeGetClosingQuotationMark(const OpeningQuote: WideChar): WideChar;
  1904. begin
  1905. case Ord(OpeningQuote) of
  1906. $00AB : Result := #$00BB; // LEFT/RIGHT -POINTING DOUBLE ANGLE QUOTATION MARK
  1907. $2018 : Result := #$2019; // LEFT/RIGHT SINGLE QUOTATION MARK
  1908. $201A : Result := #$201B; // SINGLE LOW-9 QUOTATION MARK / SINGLE HIGH-REVERSED-9 QUOTATION MARK
  1909. $201C : Result := #$201D; // LEFT/RIGHT DOUBLE QUOTATION MARK
  1910. $201E : Result := #$201F; // DOUBLE LOW-9 QUOTATION MARK / DOUBLE HIGH-REVERSED-9 QUOTATION MARK
  1911. $2039 : Result := #$203A; // SINGLE LEFT/RIGHT -POINTING ANGLE QUOTATION MARK
  1912. $301D : Result := #$301E; // REVERSED DOUBLE PRIME QUOTATION MARK / DOUBLE PRIME QUOTATION MARK (also $301F)
  1913. else
  1914. Result := #$0000;
  1915. end;
  1916. end;
  1917. function UnicodeIsOpeningQuotationMark(const Ch: WideChar): Boolean;
  1918. begin
  1919. Result := UnicodeGetClosingQuotationMark(Ch) <> #$0000;
  1920. end;
  1921. function UnicodeGetOpeningQuotationMark(const ClosingQuote: WideChar): WideChar;
  1922. begin
  1923. case Ord(ClosingQuote) of
  1924. $00BB : Result := #$00AB; // LEFT/RIGHT -POINTING DOUBLE ANGLE QUOTATION MARK
  1925. $2019 : Result := #$2018; // LEFT/RIGHT SINGLE QUOTATION MARK
  1926. $201B : Result := #$201A; // SINGLE LOW-9 QUOTATION MARK / SINGLE HIGH-REVERSED-9 QUOTATION MARK
  1927. $201D : Result := #$201C; // LEFT/RIGHT DOUBLE QUOTATION MARK
  1928. $201F : Result := #$201E; // DOUBLE LOW-9 QUOTATION MARK / DOUBLE HIGH-REVERSED-9 QUOTATION MARK
  1929. $203A : Result := #$2039; // SINGLE LEFT/RIGHT -POINTING ANGLE QUOTATION MARK
  1930. $301E : Result := #$301D; // REVERSED DOUBLE PRIME QUOTATION MARK / DOUBLE PRIME QUOTATION MARK
  1931. $301F : Result := #$301D; // REVERSED DOUBLE PRIME QUOTATION MARK / LOW DOUBLE PRIME QUOTATION MARK
  1932. else
  1933. Result := #$0000;
  1934. end;
  1935. end;
  1936. function UnicodeIsClosingQuotationMark(const Ch: WideChar): Boolean;
  1937. begin
  1938. Result := UnicodeGetOpeningQuotationMark(Ch) <> #$0000;
  1939. end;
  1940. function UnicodeIsPunctuation(const Ch: WideChar): Boolean;
  1941. begin
  1942. case Ord(Ch) of
  1943. $0021, // EXCLAMATION MARK
  1944. $0022, // QUOTATION MARK
  1945. $0023, // NUMBER SIGN
  1946. $0025, // PERCENT SIGN
  1947. $0026, // AMPERSAND
  1948. $0027, // APOSTROPHE
  1949. $0028, // LEFT PARENTHESIS
  1950. $0029, // RIGHT PARENTHESIS
  1951. $002A, // ASTERISK
  1952. $002C, // COMMA
  1953. $002D, // HYPHEN-MINUS
  1954. $002E, // FULL STOP
  1955. $002F, // SOLIDUS
  1956. $003A, // COLON
  1957. $003B, // SEMICOLON
  1958. $003F, // QUESTION MARK
  1959. $0040, // COMMERCIAL AT
  1960. $005B, // LEFT SQUARE BRACKET
  1961. $005C, // REVERSE SOLIDUS
  1962. $005D, // RIGHT SQUARE BRACKET
  1963. $005F, // LOW LINE
  1964. $007B, // LEFT CURLY BRACKET
  1965. $007D, // RIGHT CURLY BRACKET
  1966. $00A1, // INVERTED EXCLAMATION MARK
  1967. $00AB, // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
  1968. $00AD, // SOFT HYPHEN
  1969. $00B7, // MIDDLE DOT
  1970. $00BB, // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
  1971. $00BF, // INVERTED QUESTION MARK
  1972. $037E, // GREEK QUESTION MARK
  1973. $0387, // GREEK ANO TELEIA
  1974. $055A, // ARMENIAN APOSTROPHE
  1975. $055B, // ARMENIAN EMPHASIS MARK
  1976. $055C, // ARMENIAN EXCLAMATION MARK
  1977. $055D, // ARMENIAN COMMA
  1978. $055E, // ARMENIAN QUESTION MARK
  1979. $055F, // ARMENIAN ABBREVIATION MARK
  1980. $0589, // ARMENIAN FULL STOP
  1981. $058A, // ARMENIAN HYPHEN
  1982. $05BE, // HEBREW PUNCTUATION MAQAF
  1983. $05C0, // HEBREW PUNCTUATION PASEQ
  1984. $05C3, // HEBREW PUNCTUATION SOF PASUQ
  1985. $05F3, // HEBREW PUNCTUATION GERESH
  1986. $05F4, // HEBREW PUNCTUATION GERSHAYIM
  1987. $060C, // ARABIC COMMA
  1988. $061B, // ARABIC SEMICOLON
  1989. $061F, // ARABIC QUESTION MARK
  1990. $066A, // ARABIC PERCENT SIGN
  1991. $066B, // ARABIC DECIMAL SEPARATOR
  1992. $066C, // ARABIC THOUSANDS SEPARATOR
  1993. $066D, // ARABIC FIVE POINTED STAR
  1994. $06D4, // ARABIC FULL STOP
  1995. $0700, // SYRIAC END OF PARAGRAPH
  1996. $0701, // SYRIAC SUPRALINEAR FULL STOP
  1997. $0702, // SYRIAC SUBLINEAR FULL STOP
  1998. $0703, // SYRIAC SUPRALINEAR COLON
  1999. $0704, // SYRIAC SUBLINEAR COLON
  2000. $0705, // SYRIAC HORIZONTAL COLON
  2001. $0706, // SYRIAC COLON SKEWED LEFT
  2002. $0707, // SYRIAC COLON SKEWED RIGHT
  2003. $0708, // SYRIAC SUPRALINEAR COLON SKEWED LEFT
  2004. $0709, // SYRIAC SUBLINEAR COLON SKEWED RIGHT
  2005. $070A, // SYRIAC CONTRACTION
  2006. $070B, // SYRIAC HARKLEAN OBELUS
  2007. $070C, // SYRIAC HARKLEAN METOBELUS
  2008. $070D, // SYRIAC HARKLEAN ASTERISCUS
  2009. $0964, // DEVANAGARI DANDA
  2010. $0965, // DEVANAGARI DOUBLE DANDA
  2011. $0970, // DEVANAGARI ABBREVIATION SIGN
  2012. $0DF4, // SINHALA PUNCTUATION KUNDDALIYA
  2013. $0E4F, // THAI CHARACTER FONGMAN
  2014. $0E5A, // THAI CHARACTER ANGKHANKHU
  2015. $0E5B, // THAI CHARACTER KHOMUT
  2016. $0F04, // TIBETAN MARK INITIAL YIG MGO MDUN MA
  2017. $0F05, // TIBETAN MARK CLOSING YIG MGO SGAB MA
  2018. $0F06, // TIBETAN MARK CARET YIG MGO PHUR SHAD MA
  2019. $0F07, // TIBETAN MARK YIG MGO TSHEG SHAD MA
  2020. $0F08, // TIBETAN MARK SBRUL SHAD
  2021. $0F09, // TIBETAN MARK BSKUR YIG MGO
  2022. $0F0A, // TIBETAN MARK BKA- SHOG YIG MGO
  2023. $0F0B, // TIBETAN MARK INTERSYLLABIC TSHEG
  2024. $0F0C, // TIBETAN MARK DELIMITER TSHEG BSTAR
  2025. $0F0D, // TIBETAN MARK SHAD
  2026. $0F0E, // TIBETAN MARK NYIS SHAD
  2027. $0F0F, // TIBETAN MARK TSHEG SHAD
  2028. $0F10, // TIBETAN MARK NYIS TSHEG SHAD
  2029. $0F11, // TIBETAN MARK RIN CHEN SPUNGS SHAD
  2030. $0F12, // TIBETAN MARK RGYA GRAM SHAD
  2031. $0F3A, // TIBETAN MARK GUG RTAGS GYON
  2032. $0F3B, // TIBETAN MARK GUG RTAGS GYAS
  2033. $0F3C, // TIBETAN MARK ANG KHANG GYON
  2034. $0F3D, // TIBETAN MARK ANG KHANG GYAS
  2035. $0F85, // TIBETAN MARK PALUTA
  2036. $104A, // MYANMAR SIGN LITTLE SECTION
  2037. $104B, // MYANMAR SIGN SECTION
  2038. $104C, // MYANMAR SYMBOL LOCATIVE
  2039. $104D, // MYANMAR SYMBOL COMPLETED
  2040. $104E, // MYANMAR SYMBOL AFOREMENTIONED
  2041. $104F, // MYANMAR SYMBOL GENITIVE
  2042. $10FB, // GEORGIAN PARAGRAPH SEPARATOR
  2043. $1361, // ETHIOPIC WORDSPACE
  2044. $1362, // ETHIOPIC FULL STOP
  2045. $1363, // ETHIOPIC COMMA
  2046. $1364, // ETHIOPIC SEMICOLON
  2047. $1365, // ETHIOPIC COLON
  2048. $1366, // ETHIOPIC PREFACE COLON
  2049. $1367, // ETHIOPIC QUESTION MARK
  2050. $1368, // ETHIOPIC PARAGRAPH SEPARATOR
  2051. $166D, // CANADIAN SYLLABICS CHI SIGN
  2052. $166E, // CANADIAN SYLLABICS FULL STOP
  2053. $169B, // OGHAM FEATHER MARK
  2054. $169C, // OGHAM REVERSED FEATHER MARK
  2055. $16EB, // RUNIC SINGLE PUNCTUATION
  2056. $16EC, // RUNIC MULTIPLE PUNCTUATION
  2057. $16ED, // RUNIC CROSS PUNCTUATION
  2058. $17D4, // KHMER SIGN KHAN
  2059. $17D5, // KHMER SIGN BARIYOOSAN
  2060. $17D6, // KHMER SIGN CAMNUC PII KUUH
  2061. $17D7, // KHMER SIGN LEK TOO
  2062. $17D8, // KHMER SIGN BEYYAL
  2063. $17D9, // KHMER SIGN PHNAEK MUAN
  2064. $17DA, // KHMER SIGN KOOMUUT
  2065. $17DC, // KHMER SIGN AVAKRAHASANYA
  2066. $1800, // MONGOLIAN BIRGA
  2067. $1801, // MONGOLIAN ELLIPSIS
  2068. $1802, // MONGOLIAN COMMA
  2069. $1803, // MONGOLIAN FULL STOP
  2070. $1804, // MONGOLIAN COLON
  2071. $1805, // MONGOLIAN FOUR DOTS
  2072. $1806, // MONGOLIAN TODO SOFT HYPHEN
  2073. $1807, // MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
  2074. $1808, // MONGOLIAN MANCHU COMMA
  2075. $1809, // MONGOLIAN MANCHU FULL STOP
  2076. $180A, // MONGOLIAN NIRUGU
  2077. $2010, // HYPHEN
  2078. $2011, // NON-BREAKING HYPHEN
  2079. $2012, // FIGURE DASH
  2080. $2013, // EN DASH
  2081. $2014, // EM DASH
  2082. $2015, // HORIZONTAL BAR
  2083. $2016, // DOUBLE VERTICAL LINE
  2084. $2017, // DOUBLE LOW LINE
  2085. $2018, // LEFT SINGLE QUOTATION MARK
  2086. $2019, // RIGHT SINGLE QUOTATION MARK
  2087. $201A, // SINGLE LOW-9 QUOTATION MARK
  2088. $201B, // SINGLE HIGH-REVERSED-9 QUOTATION MARK
  2089. $201C, // LEFT DOUBLE QUOTATION MARK
  2090. $201D, // RIGHT DOUBLE QUOTATION MARK
  2091. $201E, // DOUBLE LOW-9 QUOTATION MARK
  2092. $201F, // DOUBLE HIGH-REVERSED-9 QUOTATION MARK
  2093. $2020, // DAGGER
  2094. $2021, // DOUBLE DAGGER
  2095. $2022, // BULLET
  2096. $2023, // TRIANGULAR BULLET
  2097. $2024, // ONE DOT LEADER
  2098. $2025, // TWO DOT LEADER
  2099. $2026, // HORIZONTAL ELLIPSIS
  2100. $2027, // HYPHENATION POINT
  2101. $2030, // PER MILLE SIGN
  2102. $2031, // PER TEN THOUSAND SIGN
  2103. $2032, // PRIME
  2104. $2033, // DOUBLE PRIME
  2105. $2034, // TRIPLE PRIME
  2106. $2035, // REVERSED PRIME
  2107. $2036, // REVERSED DOUBLE PRIME
  2108. $2037, // REVERSED TRIPLE PRIME
  2109. $2038, // CARET
  2110. $2039, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
  2111. $203A, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
  2112. $203B, // REFERENCE MARK
  2113. $203C, // DOUBLE EXCLAMATION MARK
  2114. $203D, // INTERROBANG
  2115. $203E, // OVERLINE
  2116. $203F, // UNDERTIE
  2117. $2040, // CHARACTER TIE
  2118. $2041, // CARET INSERTION POINT
  2119. $2042, // ASTERISM
  2120. $2043, // HYPHEN BULLET
  2121. $2045, // LEFT SQUARE BRACKET WITH QUILL
  2122. $2046, // RIGHT SQUARE BRACKET WITH QUILL
  2123. $2048, // QUESTION EXCLAMATION MARK
  2124. $2049, // EXCLAMATION QUESTION MARK
  2125. $204A, // TIRONIAN SIGN ET
  2126. $204B, // REVERSED PILCROW SIGN
  2127. $204C, // BLACK LEFTWARDS BULLET
  2128. $204D, // BLACK RIGHTWARDS BULLET
  2129. $207D, // SUPERSCRIPT LEFT PARENTHESIS
  2130. $207E, // SUPERSCRIPT RIGHT PARENTHESIS
  2131. $208D, // SUBSCRIPT LEFT PARENTHESIS
  2132. $208E, // SUBSCRIPT RIGHT PARENTHESIS
  2133. $2329, // LEFT-POINTING ANGLE BRACKET
  2134. $232A, // RIGHT-POINTING ANGLE BRACKET
  2135. $3001, // IDEOGRAPHIC COMMA
  2136. $3002, // IDEOGRAPHIC FULL STOP
  2137. $3003, // DITTO MARK
  2138. $3008, // LEFT ANGLE BRACKET
  2139. $3009, // RIGHT ANGLE BRACKET
  2140. $300A, // LEFT DOUBLE ANGLE BRACKET
  2141. $300B, // RIGHT DOUBLE ANGLE BRACKET
  2142. $300C, // LEFT CORNER BRACKET
  2143. $300D, // RIGHT CORNER BRACKET
  2144. $300E, // LEFT WHITE CORNER BRACKET
  2145. $300F, // RIGHT WHITE CORNER BRACKET
  2146. $3010, // LEFT BLACK LENTICULAR BRACKET
  2147. $3011, // RIGHT BLACK LENTICULAR BRACKET
  2148. $3014, // LEFT TORTOISE SHELL BRACKET
  2149. $3015, // RIGHT TORTOISE SHELL BRACKET
  2150. $3016, // LEFT WHITE LENTICULAR BRACKET
  2151. $3017, // RIGHT WHITE LENTICULAR BRACKET
  2152. $3018, // LEFT WHITE TORTOISE SHELL BRACKET
  2153. $3019, // RIGHT WHITE TORTOISE SHELL BRACKET
  2154. $301A, // LEFT WHITE SQUARE BRACKET
  2155. $301B, // RIGHT WHITE SQUARE BRACKET
  2156. $301C, // WAVE DASH
  2157. $301D, // REVERSED DOUBLE PRIME QUOTATION MARK
  2158. $301E, // DOUBLE PRIME QUOTATION MARK
  2159. $301F, // LOW DOUBLE PRIME QUOTATION MARK
  2160. $3030, // WAVY DASH
  2161. $30FB, // KATAKANA MIDDLE DOT
  2162. $FD3E, // ORNATE LEFT PARENTHESIS
  2163. $FD3F, // ORNATE RIGHT PARENTHESIS
  2164. $FE30, // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
  2165. $FE31, // PRESENTATION FORM FOR VERTICAL EM DASH
  2166. $FE32, // PRESENTATION FORM FOR VERTICAL EN DASH
  2167. $FE33, // PRESENTATION FORM FOR VERTICAL LOW LINE
  2168. $FE34, // PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
  2169. $FE35, // PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
  2170. $FE36, // PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
  2171. $FE37, // PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
  2172. $FE38, // PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
  2173. $FE39, // PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
  2174. $FE3A, // PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
  2175. $FE3B, // PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
  2176. $FE3C, // PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
  2177. $FE3D, // PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
  2178. $FE3E, // PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
  2179. $FE3F, // PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
  2180. $FE40, // PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
  2181. $FE41, // PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
  2182. $FE42, // PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
  2183. $FE43, // PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
  2184. $FE44, // PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
  2185. $FE49, // DASHED OVERLINE
  2186. $FE4A, // CENTRELINE OVERLINE
  2187. $FE4B, // WAVY OVERLINE
  2188. $FE4C, // DOUBLE WAVY OVERLINE
  2189. $FE4D, // DASHED LOW LINE
  2190. $FE4E, // CENTRELINE LOW LINE
  2191. $FE4F, // WAVY LOW LINE
  2192. $FE50, // SMALL COMMA
  2193. $FE51, // SMALL IDEOGRAPHIC COMMA
  2194. $FE52, // SMALL FULL STOP
  2195. $FE54, // SMALL SEMICOLON
  2196. $FE55, // SMALL COLON
  2197. $FE56, // SMALL QUESTION MARK
  2198. $FE57, // SMALL EXCLAMATION MARK
  2199. $FE58, // SMALL EM DASH
  2200. $FE59, // SMALL LEFT PARENTHESIS
  2201. $FE5A, // SMALL RIGHT PARENTHESIS
  2202. $FE5B, // SMALL LEFT CURLY BRACKET
  2203. $FE5C, // SMALL RIGHT CURLY BRACKET
  2204. $FE5D, // SMALL LEFT TORTOISE SHELL BRACKET
  2205. $FE5E, // SMALL RIGHT TORTOISE SHELL BRACKET
  2206. $FE5F, // SMALL NUMBER SIGN
  2207. $FE60, // SMALL AMPERSAND
  2208. $FE61, // SMALL ASTERISK
  2209. $FE63, // SMALL HYPHEN-MINUS
  2210. $FE68, // SMALL REVERSE SOLIDUS
  2211. $FE6A, // SMALL PERCENT SIGN
  2212. $FE6B, // SMALL COMMERCIAL AT
  2213. $FF01, // FULLWIDTH EXCLAMATION MARK
  2214. $FF02, // FULLWIDTH QUOTATION MARK
  2215. $FF03, // FULLWIDTH NUMBER SIGN
  2216. $FF05, // FULLWIDTH PERCENT SIGN
  2217. $FF06, // FULLWIDTH AMPERSAND
  2218. $FF07, // FULLWIDTH APOSTROPHE
  2219. $FF08, // FULLWIDTH LEFT PARENTHESIS
  2220. $FF09, // FULLWIDTH RIGHT PARENTHESIS
  2221. $FF0A, // FULLWIDTH ASTERISK
  2222. $FF0C, // FULLWIDTH COMMA
  2223. $FF0D, // FULLWIDTH HYPHEN-MINUS
  2224. $FF0E, // FULLWIDTH FULL STOP
  2225. $FF0F, // FULLWIDTH SOLIDUS
  2226. $FF1A, // FULLWIDTH COLON
  2227. $FF1B, // FULLWIDTH SEMICOLON
  2228. $FF1F, // FULLWIDTH QUESTION MARK
  2229. $FF20, // FULLWIDTH COMMERCIAL AT
  2230. $FF3B, // FULLWIDTH LEFT SQUARE BRACKET
  2231. $FF3C, // FULLWIDTH REVERSE SOLIDUS
  2232. $FF3D, // FULLWIDTH RIGHT SQUARE BRACKET
  2233. $FF3F, // FULLWIDTH LOW LINE
  2234. $FF5B, // FULLWIDTH LEFT CURLY BRACKET
  2235. $FF5D, // FULLWIDTH RIGHT CURLY BRACKET
  2236. $FF61, // HALFWIDTH IDEOGRAPHIC FULL STOP
  2237. $FF62, // HALFWIDTH LEFT CORNER BRACKET
  2238. $FF63, // HALFWIDTH RIGHT CORNER BRACKET
  2239. $FF64, // HALFWIDTH IDEOGRAPHIC COMMA
  2240. $FF65 : // HALFWIDTH KATAKANA MIDDLE DOT
  2241. Result := True;
  2242. else
  2243. Result := False;
  2244. end;
  2245. end;
  2246. function DecimalDigitBaseU(const Ch: UCS4Char): UCS4Char;
  2247. begin
  2248. case Ch of
  2249. $0030..$0039 : Result := $0030; // DIGIT
  2250. $0660..$0669 : Result := $0660; // ARABIC-INDIC DIGIT
  2251. $06F0..$06F9 : Result := $06F0; // EXTENDED ARABIC-INDIC DIGIT
  2252. $0966..$096F : Result := $0966; // DEVANAGARI DIGIT
  2253. $09E6..$09EF : Result := $09E6; // BENGALI DIGIT
  2254. $0A66..$0A6F : Result := $0A66; // GURMUKHI DIGIT
  2255. $0AE6..$0AEF : Result := $0AE6; // GUJARATI DIGIT
  2256. $0B66..$0B6F : Result := $0B66; // ORIYA DIGIT
  2257. $0C66..$0C6F : Result := $0C66; // TELUGU DIGIT
  2258. $0CE6..$0CEF : Result := $0CE6; // KANNADA DIGIT
  2259. $0D66..$0D6F : Result := $0D66; // MALAYALAM DIGIT
  2260. $0E50..$0E59 : Result := $0E50; // THAI DIGIT
  2261. $0ED0..$0ED9 : Result := $0ED0; // LAO DIGIT
  2262. $0F20..$0F29 : Result := $0F20; // TIBETAN DIGIT
  2263. $1040..$1049 : Result := $1040; // MYANMAR DIGIT
  2264. $17E0..$17E9 : Result := $17E0; // KHMER DIGIT
  2265. $1810..$1819 : Result := $1810; // MONGOLIAN DIGIT
  2266. $2070..$2079 : Result := $2070; // SUPERSCRIPT DIGIT
  2267. $2080..$2089 : Result := $2080; // SUBSCRIPT DIGIT
  2268. $FF10..$FF19 : Result := $FF10; // FULLWIDTH DIGIT
  2269. $1D7CE..$1D7D7 : Result := $1D7CE; // MATHEMATICAL BOLD DIGIT
  2270. $1D7D8..$1D7E1 : Result := $1D7D8; // MATHEMATICAL DOUBLE-STRUCK DIGIT
  2271. $1D7E2..$1D7EB : Result := $1D7E2; // MATHEMATICAL SANS-SERIF DIGIT
  2272. $1D7EC..$1D7F5 : Result := $1D7EC; // MATHEMATICAL SANS-SERIF BOLD DIGIT
  2273. $1D7F6..$1D7FF : Result := $1D7F6; // MATHEMATICAL MONOSPACE DIGIT
  2274. else
  2275. Result := 0;
  2276. end;
  2277. end;
  2278. function UnicodeDecimalDigitValue(const Ch: UCS4Char): Integer;
  2279. var I : LongWord;
  2280. begin
  2281. I := DecimalDigitBaseU(Ch);
  2282. if I = 0 then
  2283. Result := -1
  2284. else
  2285. Result := Ch - I;
  2286. end;
  2287. function UnicodeDecimalDigitValue(const Ch: WideChar): Integer;
  2288. begin
  2289. Result := UnicodeDecimalDigitValue(Ord(Ch));
  2290. end;
  2291. function UnicodeIsDecimalDigit(const Ch: UCS4Char): Boolean;
  2292. begin
  2293. Result := DecimalDigitBaseU(Ch) <> 0;
  2294. end;
  2295. function UnicodeIsDecimalDigit(const Ch: WideChar): Boolean;
  2296. begin
  2297. Result := DecimalDigitBaseU(Ord(Ch)) <> 0;
  2298. end;
  2299. function UnicodeIsAsciiDecimalDigit(const Ch: WideChar): Boolean;
  2300. begin
  2301. case Ord(Ch) of
  2302. $0030..$0039 : Result := True;
  2303. else
  2304. Result := False;
  2305. end;
  2306. end;
  2307. function UnicodeFractionCharacterValue(const Ch: WideChar; var A, B : Integer): Boolean;
  2308. begin
  2309. case Ord(Ch) of
  2310. $00BC : begin A := 1; B := 4; end; // # No VULGAR FRACTION ONE QUARTER
  2311. $00BD : begin A := 1; B := 2; end; // # No VULGAR FRACTION ONE HALF
  2312. $00BE : begin A := 3; B := 4; end; // # No VULGAR FRACTION THREE QUARTERS
  2313. $0F2A : begin A := 1; B := 2; end; // # No TIBETAN DIGIT HALF ONE
  2314. $2153 : begin A := 1; B := 3; end; // # No VULGAR FRACTION ONE THIRD
  2315. $2154 : begin A := 2; B := 3; end; // # No VULGAR FRACTION TWO THIRDS
  2316. $2155 : begin A := 1; B := 5; end; // # No VULGAR FRACTION ONE FIFTH
  2317. $2156 : begin A := 2; B := 5; end; // # No VULGAR FRACTION TWO FIFTHS
  2318. $2157 : begin A := 3; B := 5; end; // # No VULGAR FRACTION THREE FIFTHS
  2319. $2158 : begin A := 4; B := 5; end; // # No VULGAR FRACTION FOUR FIFTHS
  2320. $2159 : begin A := 1; B := 6; end; // # No VULGAR FRACTION ONE SIXTH
  2321. $215A : begin A := 5; B := 6; end; // # No VULGAR FRACTION FIVE SIXTHS
  2322. $215B : begin A := 1; B := 8; end; // # No VULGAR FRACTION ONE EIGHTH
  2323. $215C : begin A := 3; B := 8; end; // # No VULGAR FRACTION THREE EIGHTHS
  2324. $215D : begin A := 5; B := 8; end; // # No VULGAR FRACTION FIVE EIGHTHS
  2325. $215E : begin A := 7; B := 8; end; // # No VULGAR FRACTION SEVEN EIGHTHS
  2326. else
  2327. begin A := 0; B := 0; end;
  2328. end;
  2329. Result := B <> 0;
  2330. end;
  2331. function UnicodeRomanNumeralValue(const Ch: WideChar): Integer;
  2332. begin
  2333. case Ord(Ch) of
  2334. $2160 : Result := 1; // Nl ROMAN NUMERAL ONE
  2335. $2161 : Result := 2; // Nl ROMAN NUMERAL TWO
  2336. $2162 : Result := 3; // Nl ROMAN NUMERAL THREE
  2337. $2163 : Result := 4; // Nl ROMAN NUMERAL FOUR
  2338. $2164 : Result := 5; // Nl ROMAN NUMERAL FIVE
  2339. $2165 : Result := 6; // Nl ROMAN NUMERAL SIX
  2340. $2166 : Result := 7; // Nl ROMAN NUMERAL SEVEN
  2341. $2167 : Result := 8; // Nl ROMAN NUMERAL EIGHT
  2342. $2168 : Result := 9; // Nl ROMAN NUMERAL NINE
  2343. $2169 : Result := 10; // Nl ROMAN NUMERAL TEN
  2344. $216A : Result := 11; // Nl ROMAN NUMERAL ELEVEN
  2345. $216B : Result := 12; // Nl ROMAN NUMERAL TWELVE
  2346. $216C : Result := 50; // Nl ROMAN NUMERAL FIFTY
  2347. $216D : Result := 100; // Nl ROMAN NUMERAL ONE HUNDRED
  2348. $216E : Result := 500; // Nl ROMAN NUMERAL FIVE HUNDRED
  2349. $216F : Result := 1000; // Nl ROMAN NUMERAL ONE THOUSAND
  2350. $2170 : Result := 1; // Nl SMALL ROMAN NUMERAL ONE
  2351. $2171 : Result := 2; // Nl SMALL ROMAN NUMERAL TWO
  2352. $2172 : Result := 3; // Nl SMALL ROMAN NUMERAL THREE
  2353. $2173 : Result := 4; // Nl SMALL ROMAN NUMERAL FOUR
  2354. $2174 : Result := 5; // Nl SMALL ROMAN NUMERAL FIVE
  2355. $2175 : Result := 6; // Nl SMALL ROMAN NUMERAL SIX
  2356. $2176 : Result := 7; // Nl SMALL ROMAN NUMERAL SEVEN
  2357. $2177 : Result := 8; // Nl SMALL ROMAN NUMERAL EIGHT
  2358. $2178 : Result := 9; // Nl SMALL ROMAN NUMERAL NINE
  2359. $2179 : Result := 10; // Nl SMALL ROMAN NUMERAL TEN
  2360. $217A : Result := 11; // Nl SMALL ROMAN NUMERAL ELEVEN
  2361. $217B : Result := 12; // Nl SMALL ROMAN NUMERAL TWELVE
  2362. $217C : Result := 50; // Nl SMALL ROMAN NUMERAL FIFTY
  2363. $217D : Result := 100; // Nl SMALL ROMAN NUMERAL ONE HUNDRED
  2364. $217E : Result := 500; // Nl SMALL ROMAN NUMERAL FIVE HUNDRED
  2365. $217F..$2180 : Result := 1000; // Nl [2] SMALL ROMAN NUMERAL ONE THOUSAND..ROMAN NUMERAL ONE THOUSAND C D
  2366. $2181 : Result := 5000; // Nl ROMAN NUMERAL FIVE THOUSAND
  2367. $2182 : Result := 10000; // Nl ROMAN NUMERAL TEN THOUSAND
  2368. else
  2369. Result := 0;
  2370. end;
  2371. end;
  2372. function UnicodeIsAsciiHexDigit(const Ch: WideChar): Boolean;
  2373. begin
  2374. case Ord(Ch) of
  2375. $0030..$0039,
  2376. $0041..$0046,
  2377. $0061..$0066 : Result := True;
  2378. else
  2379. Result := False;
  2380. end;
  2381. end;
  2382. function LatinAlphaCharBaseU(const Ch: WideChar): UCS4Char;
  2383. begin
  2384. case Ord(Ch) of
  2385. $0041..$005A : Result := $0041; // LATIN CAPITAL LETTER
  2386. $0061..$007A : Result := $0061; // LATIN SMALL LETTER
  2387. $FF21..$FF3A : Result := $FF21; // FULLWIDTH LATIN CAPITAL LETTER
  2388. $FF41..$FF5A : Result := $FF41; // FULLWIDTH LATIN SMALL LETTER
  2389. else
  2390. Result := 0;
  2391. end;
  2392. end;
  2393. function UnicodeHexAlphaDigitBase(const Ch: WideChar): UCS4Char; overload;
  2394. begin
  2395. Result := LatinAlphaCharBaseU(Ch);
  2396. if Result = 0 then
  2397. exit;
  2398. if Ord(Ch) - Result > 5 then
  2399. Result := 0;
  2400. end;
  2401. function UnicodeHexAlphaDigitBase(const Ch: UCS4Char): UCS4Char; overload;
  2402. begin
  2403. if Ch <= $FFFF then
  2404. Result := UnicodeHexAlphaDigitBase(WideChar(Ch))
  2405. else
  2406. case Ch of
  2407. $1D400..$1D405 : Result := $1D400; // MATHEMATICAL BOLD CAPITAL
  2408. $1D41A..$1D41F : Result := $1D41A; // MATHEMATICAL BOLD SMALL
  2409. $1D434..$1D439 : Result := $1D434; // MATHEMATICAL ITALIC CAPITAL
  2410. $1D44E..$1D453 : Result := $1D44E; // MATHEMATICAL ITALIC SMALL
  2411. $1D468..$1D46D : Result := $1D468; // MATHEMATICAL BOLD ITALIC CAPITAL
  2412. $1D482..$1D487 : Result := $1D482; // MATHEMATICAL BOLD ITALIC SMALL
  2413. $1D49C..$1D4A1 : Result := $1D49C; // MATHEMATICAL SCRIPT CAPITAL
  2414. $1D4B6..$1D4BB : Result := $1D4B6; // MATHEMATICAL SCRIPT SMALL
  2415. $1D4D0..$1D4D5 : Result := $1D4D0; // MATHEMATICAL BOLD SCRIPT CAPITAL
  2416. $1D4EA..$1D4EF : Result := $1D4EA; // MATHEMATICAL BOLD SCRIPT SMALL
  2417. $1D504..$1D509 : Result := $1D504; // MATHEMATICAL FRAKTUR CAPITAL
  2418. $1D51E..$1D523 : Result := $1D51E; // MATHEMATICAL FRAKTUR SMALL
  2419. $1D538..$1D53D : Result := $1D538; // MATHEMATICAL DOUBLE-STRUCK CAPITAL
  2420. $1D552..$1D557 : Result := $1D552; // MATHEMATICAL DOUBLE-STRUCK SMALL
  2421. $1D56C..$1D571 : Result := $1D56C; // MATHEMATICAL BOLD FRAKTUR CAPITAL
  2422. $1D586..$1D58B : Result := $1D586; // MATHEMATICAL BOLD FRAKTUR SMALL
  2423. $1D5A0..$1D5A5 : Result := $1D5A0; // MATHEMATICAL SANS-SERIF CAPITAL
  2424. $1D5BA..$1D5BF : Result := $1D5BA; // MATHEMATICAL SANS-SERIF SMALL
  2425. $1D5D4..$1D5D9 : Result := $1D5D4; // MATHEMATICAL SANS-SERIF BOLD CAPITAL
  2426. $1D5EE..$1D5F3 : Result := $1D5EE; // MATHEMATICAL SANS-SERIF BOLD SMALL
  2427. $1D608..$1D60D : Result := $1D608; // MATHEMATICAL SANS-SERIF ITALIC CAPITAL
  2428. $1D622..$1D627 : Result := $1D622; // MATHEMATICAL SANS-SERIF ITALIC SMALL
  2429. $1D63C..$1D641 : Result := $1D63C; // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL
  2430. $1D656..$1D65B : Result := $1D656; // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL
  2431. $1D670..$1D675 : Result := $1D670; // MATHEMATICAL MONOSPACE CAPITAL
  2432. $1D68A..$1D68F : Result := $1D68A; // MATHEMATICAL MONOSPACE SMALL
  2433. $E0041..$E0046 : Result := $E0041; // TAG LATIN CAPITAL LETTER
  2434. else
  2435. Result := 0;
  2436. end;
  2437. end;
  2438. function UnicodeHexDigitValue(const Ch: UCS4Char): Integer;
  2439. var I : UCS4Char;
  2440. begin
  2441. Result := UnicodeDecimalDigitValue(Ch);
  2442. if Result >= 0 then
  2443. exit;
  2444. I := UnicodeHexAlphaDigitBase(Ch);
  2445. if I > 0 then
  2446. Result := Ch - I + 10;
  2447. end;
  2448. function UnicodeHexDigitValue(const Ch: WideChar): Integer;
  2449. var I : UCS4Char;
  2450. begin
  2451. Result := UnicodeDecimalDigitValue(Ch);
  2452. if Result >= 0 then
  2453. exit;
  2454. I := UnicodeHexAlphaDigitBase(Ch);
  2455. if I > 0 then
  2456. Result := Ord(Ch) - I + 10;
  2457. end;
  2458. function UnicodeIsHexDigit(const Ch: UCS4Char): Boolean;
  2459. begin
  2460. Result := UnicodeHexDigitValue(Ch) >= 0;
  2461. end;
  2462. function UnicodeIsHexDigit(const Ch: WideChar): Boolean;
  2463. begin
  2464. Result := UnicodeHexDigitValue(Ch) >= 0;
  2465. end;
  2466. { Unicode letter table }
  2467. type
  2468. TUnicodeLetterAttr = (laUpper, laLower);
  2469. TUnicodeLetterInfo = packed record
  2470. Unicode : WideChar;
  2471. Attr : TUnicodeLetterAttr;
  2472. CaseCode : WideChar;
  2473. end;
  2474. PUnicodeLetterInfo = ^TUnicodeLetterInfo;
  2475. const
  2476. // Derived from 'Lu' and 'Ll' class
  2477. UnicodeLetterEntries = 1492; // ~7K table
  2478. UnicodeLetterInfo : Array[0..UnicodeLetterEntries - 1] of TUnicodeLetterInfo = (
  2479. (Unicode:#$0041; Attr:laUpper; CaseCode:#$0061), // LATIN CAPITAL LETTER A
  2480. (Unicode:#$0042; Attr:laUpper; CaseCode:#$0062), // LATIN CAPITAL LETTER B
  2481. (Unicode:#$0043; Attr:laUpper; CaseCode:#$0063), // LATIN CAPITAL LETTER C
  2482. (Unicode:#$0044; Attr:laUpper; CaseCode:#$0064), // LATIN CAPITAL LETTER D
  2483. (Unicode:#$0045; Attr:laUpper; CaseCode:#$0065), // LATIN CAPITAL LETTER E
  2484. (Unicode:#$0046; Attr:laUpper; CaseCode:#$0066), // LATIN CAPITAL LETTER F
  2485. (Unicode:#$0047; Attr:laUpper; CaseCode:#$0067), // LATIN CAPITAL LETTER G
  2486. (Unicode:#$0048; Attr:laUpper; CaseCode:#$0068), // LATIN CAPITAL LETTER H
  2487. (Unicode:#$0049; Attr:laUpper; CaseCode:#$0069), // LATIN CAPITAL LETTER I
  2488. (Unicode:#$004A; Attr:laUpper; CaseCode:#$006A), // LATIN CAPITAL LETTER J
  2489. (Unicode:#$004B; Attr:laUpper; CaseCode:#$006B), // LATIN CAPITAL LETTER K
  2490. (Unicode:#$004C; Attr:laUpper; CaseCode:#$006C), // LATIN CAPITAL LETTER L
  2491. (Unicode:#$004D; Attr:laUpper; CaseCode:#$006D), // LATIN CAPITAL LETTER M
  2492. (Unicode:#$004E; Attr:laUpper; CaseCode:#$006E), // LATIN CAPITAL LETTER N
  2493. (Unicode:#$004F; Attr:laUpper; CaseCode:#$006F), // LATIN CAPITAL LETTER O
  2494. (Unicode:#$0050; Attr:laUpper; CaseCode:#$0070), // LATIN CAPITAL LETTER P
  2495. (Unicode:#$0051; Attr:laUpper; CaseCode:#$0071), // LATIN CAPITAL LETTER Q
  2496. (Unicode:#$0052; Attr:laUpper; CaseCode:#$0072), // LATIN CAPITAL LETTER R
  2497. (Unicode:#$0053; Attr:laUpper; CaseCode:#$0073), // LATIN CAPITAL LETTER S
  2498. (Unicode:#$0054; Attr:laUpper; CaseCode:#$0074), // LATIN CAPITAL LETTER T
  2499. (Unicode:#$0055; Attr:laUpper; CaseCode:#$0075), // LATIN CAPITAL LETTER U
  2500. (Unicode:#$0056; Attr:laUpper; CaseCode:#$0076), // LATIN CAPITAL LETTER V
  2501. (Unicode:#$0057; Attr:laUpper; CaseCode:#$0077), // LATIN CAPITAL LETTER W
  2502. (Unicode:#$0058; Attr:laUpper; CaseCode:#$0078), // LATIN CAPITAL LETTER X
  2503. (Unicode:#$0059; Attr:laUpper; CaseCode:#$0079), // LATIN CAPITAL LETTER Y
  2504. (Unicode:#$005A; Attr:laUpper; CaseCode:#$007A), // LATIN CAPITAL LETTER Z
  2505. (Unicode:#$0061; Attr:laLower; CaseCode:#$0041), // LATIN SMALL LETTER A
  2506. (Unicode:#$0062; Attr:laLower; CaseCode:#$0042), // LATIN SMALL LETTER B
  2507. (Unicode:#$0063; Attr:laLower; CaseCode:#$0043), // LATIN SMALL LETTER C
  2508. (Unicode:#$0064; Attr:laLower; CaseCode:#$0044), // LATIN SMALL LETTER D
  2509. (Unicode:#$0065; Attr:laLower; CaseCode:#$0045), // LATIN SMALL LETTER E
  2510. (Unicode:#$0066; Attr:laLower; CaseCode:#$0046), // LATIN SMALL LETTER F
  2511. (Unicode:#$0067; Attr:laLower; CaseCode:#$0047), // LATIN SMALL LETTER G
  2512. (Unicode:#$0068; Attr:laLower; CaseCode:#$0048), // LATIN SMALL LETTER H
  2513. (Unicode:#$0069; Attr:laLower; CaseCode:#$0049), // LATIN SMALL LETTER I
  2514. (Unicode:#$006A; Attr:laLower; CaseCode:#$004A), // LATIN SMALL LETTER J
  2515. (Unicode:#$006B; Attr:laLower; CaseCode:#$004B), // LATIN SMALL LETTER K
  2516. (Unicode:#$006C; Attr:laLower; CaseCode:#$004C), // LATIN SMALL LETTER L
  2517. (Unicode:#$006D; Attr:laLower; CaseCode:#$004D), // LATIN SMALL LETTER M
  2518. (Unicode:#$006E; Attr:laLower; CaseCode:#$004E), // LATIN SMALL LETTER N
  2519. (Unicode:#$006F; Attr:laLower; CaseCode:#$004F), // LATIN SMALL LETTER O
  2520. (Unicode:#$0070; Attr:laLower; CaseCode:#$0050), // LATIN SMALL LETTER P
  2521. (Unicode:#$0071; Attr:laLower; CaseCode:#$0051), // LATIN SMALL LETTER Q
  2522. (Unicode:#$0072; Attr:laLower; CaseCode:#$0052), // LATIN SMALL LETTER R
  2523. (Unicode:#$0073; Attr:laLower; CaseCode:#$0053), // LATIN SMALL LETTER S
  2524. (Unicode:#$0074; Attr:laLower; CaseCode:#$0054), // LATIN SMALL LETTER T
  2525. (Unicode:#$0075; Attr:laLower; CaseCode:#$0055), // LATIN SMALL LETTER U
  2526. (Unicode:#$0076; Attr:laLower; CaseCode:#$0056), // LATIN SMALL LETTER V
  2527. (Unicode:#$0077; Attr:laLower; CaseCode:#$0057), // LATIN SMALL LETTER W
  2528. (Unicode:#$0078; Attr:laLower; CaseCode:#$0058), // LATIN SMALL LETTER X
  2529. (Unicode:#$0079; Attr:laLower; CaseCode:#$0059), // LATIN SMALL LETTER Y
  2530. (Unicode:#$007A; Attr:laLower; CaseCode:#$005A), // LATIN SMALL LETTER Z
  2531. (Unicode:#$00AA; Attr:laLower; CaseCode:#$FFFF), // FEMININE ORDINAL INDICATOR
  2532. (Unicode:#$00B5; Attr:laLower; CaseCode:#$039C), // MICRO SIGN
  2533. (Unicode:#$00BA; Attr:laLower; CaseCode:#$FFFF), // MASCULINE ORDINAL INDICATOR
  2534. (Unicode:#$00C0; Attr:laUpper; CaseCode:#$00E0), // LATIN CAPITAL LETTER A WITH GRAVE
  2535. (Unicode:#$00C1; Attr:laUpper; CaseCode:#$00E1), // LATIN CAPITAL LETTER A WITH ACUTE
  2536. (Unicode:#$00C2; Attr:laUpper; CaseCode:#$00E2), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  2537. (Unicode:#$00C3; Attr:laUpper; CaseCode:#$00E3), // LATIN CAPITAL LETTER A WITH TILDE
  2538. (Unicode:#$00C4; Attr:laUpper; CaseCode:#$00E4), // LATIN CAPITAL LETTER A WITH DIAERESIS
  2539. (Unicode:#$00C5; Attr:laUpper; CaseCode:#$00E5), // LATIN CAPITAL LETTER A WITH RING ABOVE
  2540. (Unicode:#$00C6; Attr:laUpper; CaseCode:#$00E6), // LATIN CAPITAL LETTER AE
  2541. (Unicode:#$00C7; Attr:laUpper; CaseCode:#$00E7), // LATIN CAPITAL LETTER C WITH CEDILLA
  2542. (Unicode:#$00C8; Attr:laUpper; CaseCode:#$00E8), // LATIN CAPITAL LETTER E WITH GRAVE
  2543. (Unicode:#$00C9; Attr:laUpper; CaseCode:#$00E9), // LATIN CAPITAL LETTER E WITH ACUTE
  2544. (Unicode:#$00CA; Attr:laUpper; CaseCode:#$00EA), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  2545. (Unicode:#$00CB; Attr:laUpper; CaseCode:#$00EB), // LATIN CAPITAL LETTER E WITH DIAERESIS
  2546. (Unicode:#$00CC; Attr:laUpper; CaseCode:#$00EC), // LATIN CAPITAL LETTER I WITH GRAVE
  2547. (Unicode:#$00CD; Attr:laUpper; CaseCode:#$00ED), // LATIN CAPITAL LETTER I WITH ACUTE
  2548. (Unicode:#$00CE; Attr:laUpper; CaseCode:#$00EE), // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  2549. (Unicode:#$00CF; Attr:laUpper; CaseCode:#$00EF), // LATIN CAPITAL LETTER I WITH DIAERESIS
  2550. (Unicode:#$00D0; Attr:laUpper; CaseCode:#$00F0), // LATIN CAPITAL LETTER ETH
  2551. (Unicode:#$00D1; Attr:laUpper; CaseCode:#$00F1), // LATIN CAPITAL LETTER N WITH TILDE
  2552. (Unicode:#$00D2; Attr:laUpper; CaseCode:#$00F2), // LATIN CAPITAL LETTER O WITH GRAVE
  2553. (Unicode:#$00D3; Attr:laUpper; CaseCode:#$00F3), // LATIN CAPITAL LETTER O WITH ACUTE
  2554. (Unicode:#$00D4; Attr:laUpper; CaseCode:#$00F4), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  2555. (Unicode:#$00D5; Attr:laUpper; CaseCode:#$00F5), // LATIN CAPITAL LETTER O WITH TILDE
  2556. (Unicode:#$00D6; Attr:laUpper; CaseCode:#$00F6), // LATIN CAPITAL LETTER O WITH DIAERESIS
  2557. (Unicode:#$00D8; Attr:laUpper; CaseCode:#$00F8), // LATIN CAPITAL LETTER O WITH STROKE
  2558. (Unicode:#$00D9; Attr:laUpper; CaseCode:#$00F9), // LATIN CAPITAL LETTER U WITH GRAVE
  2559. (Unicode:#$00DA; Attr:laUpper; CaseCode:#$00FA), // LATIN CAPITAL LETTER U WITH ACUTE
  2560. (Unicode:#$00DB; Attr:laUpper; CaseCode:#$00FB), // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
  2561. (Unicode:#$00DC; Attr:laUpper; CaseCode:#$00FC), // LATIN CAPITAL LETTER U WITH DIAERESIS
  2562. (Unicode:#$00DD; Attr:laUpper; CaseCode:#$00FD), // LATIN CAPITAL LETTER Y WITH ACUTE
  2563. (Unicode:#$00DE; Attr:laUpper; CaseCode:#$00FE), // LATIN CAPITAL LETTER THORN
  2564. (Unicode:#$00DF; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER SHARP S
  2565. (Unicode:#$00E0; Attr:laLower; CaseCode:#$00C0), // LATIN SMALL LETTER A WITH GRAVE
  2566. (Unicode:#$00E1; Attr:laLower; CaseCode:#$00C1), // LATIN SMALL LETTER A WITH ACUTE
  2567. (Unicode:#$00E2; Attr:laLower; CaseCode:#$00C2), // LATIN SMALL LETTER A WITH CIRCUMFLEX
  2568. (Unicode:#$00E3; Attr:laLower; CaseCode:#$00C3), // LATIN SMALL LETTER A WITH TILDE
  2569. (Unicode:#$00E4; Attr:laLower; CaseCode:#$00C4), // LATIN SMALL LETTER A WITH DIAERESIS
  2570. (Unicode:#$00E5; Attr:laLower; CaseCode:#$00C5), // LATIN SMALL LETTER A WITH RING ABOVE
  2571. (Unicode:#$00E6; Attr:laLower; CaseCode:#$00C6), // LATIN SMALL LETTER AE
  2572. (Unicode:#$00E7; Attr:laLower; CaseCode:#$00C7), // LATIN SMALL LETTER C WITH CEDILLA
  2573. (Unicode:#$00E8; Attr:laLower; CaseCode:#$00C8), // LATIN SMALL LETTER E WITH GRAVE
  2574. (Unicode:#$00E9; Attr:laLower; CaseCode:#$00C9), // LATIN SMALL LETTER E WITH ACUTE
  2575. (Unicode:#$00EA; Attr:laLower; CaseCode:#$00CA), // LATIN SMALL LETTER E WITH CIRCUMFLEX
  2576. (Unicode:#$00EB; Attr:laLower; CaseCode:#$00CB), // LATIN SMALL LETTER E WITH DIAERESIS
  2577. (Unicode:#$00EC; Attr:laLower; CaseCode:#$00CC), // LATIN SMALL LETTER I WITH GRAVE
  2578. (Unicode:#$00ED; Attr:laLower; CaseCode:#$00CD), // LATIN SMALL LETTER I WITH ACUTE
  2579. (Unicode:#$00EE; Attr:laLower; CaseCode:#$00CE), // LATIN SMALL LETTER I WITH CIRCUMFLEX
  2580. (Unicode:#$00EF; Attr:laLower; CaseCode:#$00CF), // LATIN SMALL LETTER I WITH DIAERESIS
  2581. (Unicode:#$00F0; Attr:laLower; CaseCode:#$00D0), // LATIN SMALL LETTER ETH
  2582. (Unicode:#$00F1; Attr:laLower; CaseCode:#$00D1), // LATIN SMALL LETTER N WITH TILDE
  2583. (Unicode:#$00F2; Attr:laLower; CaseCode:#$00D2), // LATIN SMALL LETTER O WITH GRAVE
  2584. (Unicode:#$00F3; Attr:laLower; CaseCode:#$00D3), // LATIN SMALL LETTER O WITH ACUTE
  2585. (Unicode:#$00F4; Attr:laLower; CaseCode:#$00D4), // LATIN SMALL LETTER O WITH CIRCUMFLEX
  2586. (Unicode:#$00F5; Attr:laLower; CaseCode:#$00D5), // LATIN SMALL LETTER O WITH TILDE
  2587. (Unicode:#$00F6; Attr:laLower; CaseCode:#$00D6), // LATIN SMALL LETTER O WITH DIAERESIS
  2588. (Unicode:#$00F8; Attr:laLower; CaseCode:#$00D8), // LATIN SMALL LETTER O WITH STROKE
  2589. (Unicode:#$00F9; Attr:laLower; CaseCode:#$00D9), // LATIN SMALL LETTER U WITH GRAVE
  2590. (Unicode:#$00FA; Attr:laLower; CaseCode:#$00DA), // LATIN SMALL LETTER U WITH ACUTE
  2591. (Unicode:#$00FB; Attr:laLower; CaseCode:#$00DB), // LATIN SMALL LETTER U WITH CIRCUMFLEX
  2592. (Unicode:#$00FC; Attr:laLower; CaseCode:#$00DC), // LATIN SMALL LETTER U WITH DIAERESIS
  2593. (Unicode:#$00FD; Attr:laLower; CaseCode:#$00DD), // LATIN SMALL LETTER Y WITH ACUTE
  2594. (Unicode:#$00FE; Attr:laLower; CaseCode:#$00DE), // LATIN SMALL LETTER THORN
  2595. (Unicode:#$00FF; Attr:laLower; CaseCode:#$0178), // LATIN SMALL LETTER Y WITH DIAERESIS
  2596. (Unicode:#$0100; Attr:laUpper; CaseCode:#$0101), // LATIN CAPITAL LETTER A WITH MACRON
  2597. (Unicode:#$0101; Attr:laLower; CaseCode:#$0100), // LATIN SMALL LETTER A WITH MACRON
  2598. (Unicode:#$0102; Attr:laUpper; CaseCode:#$0103), // LATIN CAPITAL LETTER A WITH BREVE
  2599. (Unicode:#$0103; Attr:laLower; CaseCode:#$0102), // LATIN SMALL LETTER A WITH BREVE
  2600. (Unicode:#$0104; Attr:laUpper; CaseCode:#$0105), // LATIN CAPITAL LETTER A WITH OGONEK
  2601. (Unicode:#$0105; Attr:laLower; CaseCode:#$0104), // LATIN SMALL LETTER A WITH OGONEK
  2602. (Unicode:#$0106; Attr:laUpper; CaseCode:#$0107), // LATIN CAPITAL LETTER C WITH ACUTE
  2603. (Unicode:#$0107; Attr:laLower; CaseCode:#$0106), // LATIN SMALL LETTER C WITH ACUTE
  2604. (Unicode:#$0108; Attr:laUpper; CaseCode:#$0109), // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
  2605. (Unicode:#$0109; Attr:laLower; CaseCode:#$0108), // LATIN SMALL LETTER C WITH CIRCUMFLEX
  2606. (Unicode:#$010A; Attr:laUpper; CaseCode:#$010B), // LATIN CAPITAL LETTER C WITH DOT ABOVE
  2607. (Unicode:#$010B; Attr:laLower; CaseCode:#$010A), // LATIN SMALL LETTER C WITH DOT ABOVE
  2608. (Unicode:#$010C; Attr:laUpper; CaseCode:#$010D), // LATIN CAPITAL LETTER C WITH CARON
  2609. (Unicode:#$010D; Attr:laLower; CaseCode:#$010C), // LATIN SMALL LETTER C WITH CARON
  2610. (Unicode:#$010E; Attr:laUpper; CaseCode:#$010F), // LATIN CAPITAL LETTER D WITH CARON
  2611. (Unicode:#$010F; Attr:laLower; CaseCode:#$010E), // LATIN SMALL LETTER D WITH CARON
  2612. (Unicode:#$0110; Attr:laUpper; CaseCode:#$0111), // LATIN CAPITAL LETTER D WITH STROKE
  2613. (Unicode:#$0111; Attr:laLower; CaseCode:#$0110), // LATIN SMALL LETTER D WITH STROKE
  2614. (Unicode:#$0112; Attr:laUpper; CaseCode:#$0113), // LATIN CAPITAL LETTER E WITH MACRON
  2615. (Unicode:#$0113; Attr:laLower; CaseCode:#$0112), // LATIN SMALL LETTER E WITH MACRON
  2616. (Unicode:#$0114; Attr:laUpper; CaseCode:#$0115), // LATIN CAPITAL LETTER E WITH BREVE
  2617. (Unicode:#$0115; Attr:laLower; CaseCode:#$0114), // LATIN SMALL LETTER E WITH BREVE
  2618. (Unicode:#$0116; Attr:laUpper; CaseCode:#$0117), // LATIN CAPITAL LETTER E WITH DOT ABOVE
  2619. (Unicode:#$0117; Attr:laLower; CaseCode:#$0116), // LATIN SMALL LETTER E WITH DOT ABOVE
  2620. (Unicode:#$0118; Attr:laUpper; CaseCode:#$0119), // LATIN CAPITAL LETTER E WITH OGONEK
  2621. (Unicode:#$0119; Attr:laLower; CaseCode:#$0118), // LATIN SMALL LETTER E WITH OGONEK
  2622. (Unicode:#$011A; Attr:laUpper; CaseCode:#$011B), // LATIN CAPITAL LETTER E WITH CARON
  2623. (Unicode:#$011B; Attr:laLower; CaseCode:#$011A), // LATIN SMALL LETTER E WITH CARON
  2624. (Unicode:#$011C; Attr:laUpper; CaseCode:#$011D), // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
  2625. (Unicode:#$011D; Attr:laLower; CaseCode:#$011C), // LATIN SMALL LETTER G WITH CIRCUMFLEX
  2626. (Unicode:#$011E; Attr:laUpper; CaseCode:#$011F), // LATIN CAPITAL LETTER G WITH BREVE
  2627. (Unicode:#$011F; Attr:laLower; CaseCode:#$011E), // LATIN SMALL LETTER G WITH BREVE
  2628. (Unicode:#$0120; Attr:laUpper; CaseCode:#$0121), // LATIN CAPITAL LETTER G WITH DOT ABOVE
  2629. (Unicode:#$0121; Attr:laLower; CaseCode:#$0120), // LATIN SMALL LETTER G WITH DOT ABOVE
  2630. (Unicode:#$0122; Attr:laUpper; CaseCode:#$0123), // LATIN CAPITAL LETTER G WITH CEDILLA
  2631. (Unicode:#$0123; Attr:laLower; CaseCode:#$0122), // LATIN SMALL LETTER G WITH CEDILLA
  2632. (Unicode:#$0124; Attr:laUpper; CaseCode:#$0125), // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
  2633. (Unicode:#$0125; Attr:laLower; CaseCode:#$0124), // LATIN SMALL LETTER H WITH CIRCUMFLEX
  2634. (Unicode:#$0126; Attr:laUpper; CaseCode:#$0127), // LATIN CAPITAL LETTER H WITH STROKE
  2635. (Unicode:#$0127; Attr:laLower; CaseCode:#$0126), // LATIN SMALL LETTER H WITH STROKE
  2636. (Unicode:#$0128; Attr:laUpper; CaseCode:#$0129), // LATIN CAPITAL LETTER I WITH TILDE
  2637. (Unicode:#$0129; Attr:laLower; CaseCode:#$0128), // LATIN SMALL LETTER I WITH TILDE
  2638. (Unicode:#$012A; Attr:laUpper; CaseCode:#$012B), // LATIN CAPITAL LETTER I WITH MACRON
  2639. (Unicode:#$012B; Attr:laLower; CaseCode:#$012A), // LATIN SMALL LETTER I WITH MACRON
  2640. (Unicode:#$012C; Attr:laUpper; CaseCode:#$012D), // LATIN CAPITAL LETTER I WITH BREVE
  2641. (Unicode:#$012D; Attr:laLower; CaseCode:#$012C), // LATIN SMALL LETTER I WITH BREVE
  2642. (Unicode:#$012E; Attr:laUpper; CaseCode:#$012F), // LATIN CAPITAL LETTER I WITH OGONEK
  2643. (Unicode:#$012F; Attr:laLower; CaseCode:#$012E), // LATIN SMALL LETTER I WITH OGONEK
  2644. (Unicode:#$0130; Attr:laUpper; CaseCode:#$0069), // LATIN CAPITAL LETTER I WITH DOT ABOVE
  2645. (Unicode:#$0131; Attr:laLower; CaseCode:#$0049), // LATIN SMALL LETTER DOTLESS I
  2646. (Unicode:#$0132; Attr:laUpper; CaseCode:#$0133), // LATIN CAPITAL LIGATURE IJ
  2647. (Unicode:#$0133; Attr:laLower; CaseCode:#$0132), // LATIN SMALL LIGATURE IJ
  2648. (Unicode:#$0134; Attr:laUpper; CaseCode:#$0135), // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
  2649. (Unicode:#$0135; Attr:laLower; CaseCode:#$0134), // LATIN SMALL LETTER J WITH CIRCUMFLEX
  2650. (Unicode:#$0136; Attr:laUpper; CaseCode:#$0137), // LATIN CAPITAL LETTER K WITH CEDILLA
  2651. (Unicode:#$0137; Attr:laLower; CaseCode:#$0136), // LATIN SMALL LETTER K WITH CEDILLA
  2652. (Unicode:#$0138; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER KRA
  2653. (Unicode:#$0139; Attr:laUpper; CaseCode:#$013A), // LATIN CAPITAL LETTER L WITH ACUTE
  2654. (Unicode:#$013A; Attr:laLower; CaseCode:#$0139), // LATIN SMALL LETTER L WITH ACUTE
  2655. (Unicode:#$013B; Attr:laUpper; CaseCode:#$013C), // LATIN CAPITAL LETTER L WITH CEDILLA
  2656. (Unicode:#$013C; Attr:laLower; CaseCode:#$013B), // LATIN SMALL LETTER L WITH CEDILLA
  2657. (Unicode:#$013D; Attr:laUpper; CaseCode:#$013E), // LATIN CAPITAL LETTER L WITH CARON
  2658. (Unicode:#$013E; Attr:laLower; CaseCode:#$013D), // LATIN SMALL LETTER L WITH CARON
  2659. (Unicode:#$013F; Attr:laUpper; CaseCode:#$0140), // LATIN CAPITAL LETTER L WITH MIDDLE DOT
  2660. (Unicode:#$0140; Attr:laLower; CaseCode:#$013F), // LATIN SMALL LETTER L WITH MIDDLE DOT
  2661. (Unicode:#$0141; Attr:laUpper; CaseCode:#$0142), // LATIN CAPITAL LETTER L WITH STROKE
  2662. (Unicode:#$0142; Attr:laLower; CaseCode:#$0141), // LATIN SMALL LETTER L WITH STROKE
  2663. (Unicode:#$0143; Attr:laUpper; CaseCode:#$0144), // LATIN CAPITAL LETTER N WITH ACUTE
  2664. (Unicode:#$0144; Attr:laLower; CaseCode:#$0143), // LATIN SMALL LETTER N WITH ACUTE
  2665. (Unicode:#$0145; Attr:laUpper; CaseCode:#$0146), // LATIN CAPITAL LETTER N WITH CEDILLA
  2666. (Unicode:#$0146; Attr:laLower; CaseCode:#$0145), // LATIN SMALL LETTER N WITH CEDILLA
  2667. (Unicode:#$0147; Attr:laUpper; CaseCode:#$0148), // LATIN CAPITAL LETTER N WITH CARON
  2668. (Unicode:#$0148; Attr:laLower; CaseCode:#$0147), // LATIN SMALL LETTER N WITH CARON
  2669. (Unicode:#$0149; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
  2670. (Unicode:#$014A; Attr:laUpper; CaseCode:#$014B), // LATIN CAPITAL LETTER ENG
  2671. (Unicode:#$014B; Attr:laLower; CaseCode:#$014A), // LATIN SMALL LETTER ENG
  2672. (Unicode:#$014C; Attr:laUpper; CaseCode:#$014D), // LATIN CAPITAL LETTER O WITH MACRON
  2673. (Unicode:#$014D; Attr:laLower; CaseCode:#$014C), // LATIN SMALL LETTER O WITH MACRON
  2674. (Unicode:#$014E; Attr:laUpper; CaseCode:#$014F), // LATIN CAPITAL LETTER O WITH BREVE
  2675. (Unicode:#$014F; Attr:laLower; CaseCode:#$014E), // LATIN SMALL LETTER O WITH BREVE
  2676. (Unicode:#$0150; Attr:laUpper; CaseCode:#$0151), // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
  2677. (Unicode:#$0151; Attr:laLower; CaseCode:#$0150), // LATIN SMALL LETTER O WITH DOUBLE ACUTE
  2678. (Unicode:#$0152; Attr:laUpper; CaseCode:#$0153), // LATIN CAPITAL LIGATURE OE
  2679. (Unicode:#$0153; Attr:laLower; CaseCode:#$0152), // LATIN SMALL LIGATURE OE
  2680. (Unicode:#$0154; Attr:laUpper; CaseCode:#$0155), // LATIN CAPITAL LETTER R WITH ACUTE
  2681. (Unicode:#$0155; Attr:laLower; CaseCode:#$0154), // LATIN SMALL LETTER R WITH ACUTE
  2682. (Unicode:#$0156; Attr:laUpper; CaseCode:#$0157), // LATIN CAPITAL LETTER R WITH CEDILLA
  2683. (Unicode:#$0157; Attr:laLower; CaseCode:#$0156), // LATIN SMALL LETTER R WITH CEDILLA
  2684. (Unicode:#$0158; Attr:laUpper; CaseCode:#$0159), // LATIN CAPITAL LETTER R WITH CARON
  2685. (Unicode:#$0159; Attr:laLower; CaseCode:#$0158), // LATIN SMALL LETTER R WITH CARON
  2686. (Unicode:#$015A; Attr:laUpper; CaseCode:#$015B), // LATIN CAPITAL LETTER S WITH ACUTE
  2687. (Unicode:#$015B; Attr:laLower; CaseCode:#$015A), // LATIN SMALL LETTER S WITH ACUTE
  2688. (Unicode:#$015C; Attr:laUpper; CaseCode:#$015D), // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
  2689. (Unicode:#$015D; Attr:laLower; CaseCode:#$015C), // LATIN SMALL LETTER S WITH CIRCUMFLEX
  2690. (Unicode:#$015E; Attr:laUpper; CaseCode:#$015F), // LATIN CAPITAL LETTER S WITH CEDILLA
  2691. (Unicode:#$015F; Attr:laLower; CaseCode:#$015E), // LATIN SMALL LETTER S WITH CEDILLA
  2692. (Unicode:#$0160; Attr:laUpper; CaseCode:#$0161), // LATIN CAPITAL LETTER S WITH CARON
  2693. (Unicode:#$0161; Attr:laLower; CaseCode:#$0160), // LATIN SMALL LETTER S WITH CARON
  2694. (Unicode:#$0162; Attr:laUpper; CaseCode:#$0163), // LATIN CAPITAL LETTER T WITH CEDILLA
  2695. (Unicode:#$0163; Attr:laLower; CaseCode:#$0162), // LATIN SMALL LETTER T WITH CEDILLA
  2696. (Unicode:#$0164; Attr:laUpper; CaseCode:#$0165), // LATIN CAPITAL LETTER T WITH CARON
  2697. (Unicode:#$0165; Attr:laLower; CaseCode:#$0164), // LATIN SMALL LETTER T WITH CARON
  2698. (Unicode:#$0166; Attr:laUpper; CaseCode:#$0167), // LATIN CAPITAL LETTER T WITH STROKE
  2699. (Unicode:#$0167; Attr:laLower; CaseCode:#$0166), // LATIN SMALL LETTER T WITH STROKE
  2700. (Unicode:#$0168; Attr:laUpper; CaseCode:#$0169), // LATIN CAPITAL LETTER U WITH TILDE
  2701. (Unicode:#$0169; Attr:laLower; CaseCode:#$0168), // LATIN SMALL LETTER U WITH TILDE
  2702. (Unicode:#$016A; Attr:laUpper; CaseCode:#$016B), // LATIN CAPITAL LETTER U WITH MACRON
  2703. (Unicode:#$016B; Attr:laLower; CaseCode:#$016A), // LATIN SMALL LETTER U WITH MACRON
  2704. (Unicode:#$016C; Attr:laUpper; CaseCode:#$016D), // LATIN CAPITAL LETTER U WITH BREVE
  2705. (Unicode:#$016D; Attr:laLower; CaseCode:#$016C), // LATIN SMALL LETTER U WITH BREVE
  2706. (Unicode:#$016E; Attr:laUpper; CaseCode:#$016F), // LATIN CAPITAL LETTER U WITH RING ABOVE
  2707. (Unicode:#$016F; Attr:laLower; CaseCode:#$016E), // LATIN SMALL LETTER U WITH RING ABOVE
  2708. (Unicode:#$0170; Attr:laUpper; CaseCode:#$0171), // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
  2709. (Unicode:#$0171; Attr:laLower; CaseCode:#$0170), // LATIN SMALL LETTER U WITH DOUBLE ACUTE
  2710. (Unicode:#$0172; Attr:laUpper; CaseCode:#$0173), // LATIN CAPITAL LETTER U WITH OGONEK
  2711. (Unicode:#$0173; Attr:laLower; CaseCode:#$0172), // LATIN SMALL LETTER U WITH OGONEK
  2712. (Unicode:#$0174; Attr:laUpper; CaseCode:#$0175), // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
  2713. (Unicode:#$0175; Attr:laLower; CaseCode:#$0174), // LATIN SMALL LETTER W WITH CIRCUMFLEX
  2714. (Unicode:#$0176; Attr:laUpper; CaseCode:#$0177), // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
  2715. (Unicode:#$0177; Attr:laLower; CaseCode:#$0176), // LATIN SMALL LETTER Y WITH CIRCUMFLEX
  2716. (Unicode:#$0178; Attr:laUpper; CaseCode:#$00FF), // LATIN CAPITAL LETTER Y WITH DIAERESIS
  2717. (Unicode:#$0179; Attr:laUpper; CaseCode:#$017A), // LATIN CAPITAL LETTER Z WITH ACUTE
  2718. (Unicode:#$017A; Attr:laLower; CaseCode:#$0179), // LATIN SMALL LETTER Z WITH ACUTE
  2719. (Unicode:#$017B; Attr:laUpper; CaseCode:#$017C), // LATIN CAPITAL LETTER Z WITH DOT ABOVE
  2720. (Unicode:#$017C; Attr:laLower; CaseCode:#$017B), // LATIN SMALL LETTER Z WITH DOT ABOVE
  2721. (Unicode:#$017D; Attr:laUpper; CaseCode:#$017E), // LATIN CAPITAL LETTER Z WITH CARON
  2722. (Unicode:#$017E; Attr:laLower; CaseCode:#$017D), // LATIN SMALL LETTER Z WITH CARON
  2723. (Unicode:#$017F; Attr:laLower; CaseCode:#$0053), // LATIN SMALL LETTER LONG S
  2724. (Unicode:#$0180; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER B WITH STROKE
  2725. (Unicode:#$0181; Attr:laUpper; CaseCode:#$0253), // LATIN CAPITAL LETTER B WITH HOOK
  2726. (Unicode:#$0182; Attr:laUpper; CaseCode:#$0183), // LATIN CAPITAL LETTER B WITH TOPBAR
  2727. (Unicode:#$0183; Attr:laLower; CaseCode:#$0182), // LATIN SMALL LETTER B WITH TOPBAR
  2728. (Unicode:#$0184; Attr:laUpper; CaseCode:#$0185), // LATIN CAPITAL LETTER TONE SIX
  2729. (Unicode:#$0185; Attr:laLower; CaseCode:#$0184), // LATIN SMALL LETTER TONE SIX
  2730. (Unicode:#$0186; Attr:laUpper; CaseCode:#$0254), // LATIN CAPITAL LETTER OPEN O
  2731. (Unicode:#$0187; Attr:laUpper; CaseCode:#$0188), // LATIN CAPITAL LETTER C WITH HOOK
  2732. (Unicode:#$0188; Attr:laLower; CaseCode:#$0187), // LATIN SMALL LETTER C WITH HOOK
  2733. (Unicode:#$0189; Attr:laUpper; CaseCode:#$0256), // LATIN CAPITAL LETTER AFRICAN D
  2734. (Unicode:#$018A; Attr:laUpper; CaseCode:#$0257), // LATIN CAPITAL LETTER D WITH HOOK
  2735. (Unicode:#$018B; Attr:laUpper; CaseCode:#$018C), // LATIN CAPITAL LETTER D WITH TOPBAR
  2736. (Unicode:#$018C; Attr:laLower; CaseCode:#$018B), // LATIN SMALL LETTER D WITH TOPBAR
  2737. (Unicode:#$018D; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED DELTA
  2738. (Unicode:#$018E; Attr:laUpper; CaseCode:#$01DD), // LATIN CAPITAL LETTER REVERSED E
  2739. (Unicode:#$018F; Attr:laUpper; CaseCode:#$0259), // LATIN CAPITAL LETTER SCHWA
  2740. (Unicode:#$0190; Attr:laUpper; CaseCode:#$025B), // LATIN CAPITAL LETTER OPEN E
  2741. (Unicode:#$0191; Attr:laUpper; CaseCode:#$0192), // LATIN CAPITAL LETTER F WITH HOOK
  2742. (Unicode:#$0192; Attr:laLower; CaseCode:#$0191), // LATIN SMALL LETTER F WITH HOOK
  2743. (Unicode:#$0193; Attr:laUpper; CaseCode:#$0260), // LATIN CAPITAL LETTER G WITH HOOK
  2744. (Unicode:#$0194; Attr:laUpper; CaseCode:#$0263), // LATIN CAPITAL LETTER GAMMA
  2745. (Unicode:#$0195; Attr:laLower; CaseCode:#$01F6), // LATIN SMALL LETTER HV
  2746. (Unicode:#$0196; Attr:laUpper; CaseCode:#$0269), // LATIN CAPITAL LETTER IOTA
  2747. (Unicode:#$0197; Attr:laUpper; CaseCode:#$0268), // LATIN CAPITAL LETTER I WITH STROKE
  2748. (Unicode:#$0198; Attr:laUpper; CaseCode:#$0199), // LATIN CAPITAL LETTER K WITH HOOK
  2749. (Unicode:#$0199; Attr:laLower; CaseCode:#$0198), // LATIN SMALL LETTER K WITH HOOK
  2750. (Unicode:#$019A; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER L WITH BAR
  2751. (Unicode:#$019B; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER LAMBDA WITH STROKE
  2752. (Unicode:#$019C; Attr:laUpper; CaseCode:#$026F), // LATIN CAPITAL LETTER TURNED M
  2753. (Unicode:#$019D; Attr:laUpper; CaseCode:#$0272), // LATIN CAPITAL LETTER N WITH LEFT HOOK
  2754. (Unicode:#$019E; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER N WITH LONG RIGHT LEG
  2755. (Unicode:#$019F; Attr:laUpper; CaseCode:#$0275), // LATIN CAPITAL LETTER O WITH MIDDLE TILDE
  2756. (Unicode:#$01A0; Attr:laUpper; CaseCode:#$01A1), // LATIN CAPITAL LETTER O WITH HORN
  2757. (Unicode:#$01A1; Attr:laLower; CaseCode:#$01A0), // LATIN SMALL LETTER O WITH HORN
  2758. (Unicode:#$01A2; Attr:laUpper; CaseCode:#$01A3), // LATIN CAPITAL LETTER OI
  2759. (Unicode:#$01A3; Attr:laLower; CaseCode:#$01A2), // LATIN SMALL LETTER OI
  2760. (Unicode:#$01A4; Attr:laUpper; CaseCode:#$01A5), // LATIN CAPITAL LETTER P WITH HOOK
  2761. (Unicode:#$01A5; Attr:laLower; CaseCode:#$01A4), // LATIN SMALL LETTER P WITH HOOK
  2762. (Unicode:#$01A6; Attr:laUpper; CaseCode:#$0280), // LATIN LETTER YR
  2763. (Unicode:#$01A7; Attr:laUpper; CaseCode:#$01A8), // LATIN CAPITAL LETTER TONE TWO
  2764. (Unicode:#$01A8; Attr:laLower; CaseCode:#$01A7), // LATIN SMALL LETTER TONE TWO
  2765. (Unicode:#$01A9; Attr:laUpper; CaseCode:#$0283), // LATIN CAPITAL LETTER ESH
  2766. (Unicode:#$01AA; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER REVERSED ESH LOOP
  2767. (Unicode:#$01AB; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER T WITH PALATAL HOOK
  2768. (Unicode:#$01AC; Attr:laUpper; CaseCode:#$01AD), // LATIN CAPITAL LETTER T WITH HOOK
  2769. (Unicode:#$01AD; Attr:laLower; CaseCode:#$01AC), // LATIN SMALL LETTER T WITH HOOK
  2770. (Unicode:#$01AE; Attr:laUpper; CaseCode:#$0288), // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
  2771. (Unicode:#$01AF; Attr:laUpper; CaseCode:#$01B0), // LATIN CAPITAL LETTER U WITH HORN
  2772. (Unicode:#$01B0; Attr:laLower; CaseCode:#$01AF), // LATIN SMALL LETTER U WITH HORN
  2773. (Unicode:#$01B1; Attr:laUpper; CaseCode:#$028A), // LATIN CAPITAL LETTER UPSILON
  2774. (Unicode:#$01B2; Attr:laUpper; CaseCode:#$028B), // LATIN CAPITAL LETTER V WITH HOOK
  2775. (Unicode:#$01B3; Attr:laUpper; CaseCode:#$01B4), // LATIN CAPITAL LETTER Y WITH HOOK
  2776. (Unicode:#$01B4; Attr:laLower; CaseCode:#$01B3), // LATIN SMALL LETTER Y WITH HOOK
  2777. (Unicode:#$01B5; Attr:laUpper; CaseCode:#$01B6), // LATIN CAPITAL LETTER Z WITH STROKE
  2778. (Unicode:#$01B6; Attr:laLower; CaseCode:#$01B5), // LATIN SMALL LETTER Z WITH STROKE
  2779. (Unicode:#$01B7; Attr:laUpper; CaseCode:#$0292), // LATIN CAPITAL LETTER EZH
  2780. (Unicode:#$01B8; Attr:laUpper; CaseCode:#$01B9), // LATIN CAPITAL LETTER EZH REVERSED
  2781. (Unicode:#$01B9; Attr:laLower; CaseCode:#$01B8), // LATIN SMALL LETTER EZH REVERSED
  2782. (Unicode:#$01BA; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER EZH WITH TAIL
  2783. (Unicode:#$01BC; Attr:laUpper; CaseCode:#$01BD), // LATIN CAPITAL LETTER TONE FIVE
  2784. (Unicode:#$01BD; Attr:laLower; CaseCode:#$01BC), // LATIN SMALL LETTER TONE FIVE
  2785. (Unicode:#$01BE; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE
  2786. (Unicode:#$01BF; Attr:laLower; CaseCode:#$01F7), // LATIN LETTER WYNN
  2787. (Unicode:#$01C4; Attr:laUpper; CaseCode:#$01C6), // LATIN CAPITAL LETTER DZ WITH CARON
  2788. (Unicode:#$01C6; Attr:laLower; CaseCode:#$01C4), // LATIN SMALL LETTER DZ WITH CARON
  2789. (Unicode:#$01C7; Attr:laUpper; CaseCode:#$01C9), // LATIN CAPITAL LETTER LJ
  2790. (Unicode:#$01C9; Attr:laLower; CaseCode:#$01C7), // LATIN SMALL LETTER LJ
  2791. (Unicode:#$01CA; Attr:laUpper; CaseCode:#$01CC), // LATIN CAPITAL LETTER NJ
  2792. (Unicode:#$01CC; Attr:laLower; CaseCode:#$01CA), // LATIN SMALL LETTER NJ
  2793. (Unicode:#$01CD; Attr:laUpper; CaseCode:#$01CE), // LATIN CAPITAL LETTER A WITH CARON
  2794. (Unicode:#$01CE; Attr:laLower; CaseCode:#$01CD), // LATIN SMALL LETTER A WITH CARON
  2795. (Unicode:#$01CF; Attr:laUpper; CaseCode:#$01D0), // LATIN CAPITAL LETTER I WITH CARON
  2796. (Unicode:#$01D0; Attr:laLower; CaseCode:#$01CF), // LATIN SMALL LETTER I WITH CARON
  2797. (Unicode:#$01D1; Attr:laUpper; CaseCode:#$01D2), // LATIN CAPITAL LETTER O WITH CARON
  2798. (Unicode:#$01D2; Attr:laLower; CaseCode:#$01D1), // LATIN SMALL LETTER O WITH CARON
  2799. (Unicode:#$01D3; Attr:laUpper; CaseCode:#$01D4), // LATIN CAPITAL LETTER U WITH CARON
  2800. (Unicode:#$01D4; Attr:laLower; CaseCode:#$01D3), // LATIN SMALL LETTER U WITH CARON
  2801. (Unicode:#$01D5; Attr:laUpper; CaseCode:#$01D6), // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
  2802. (Unicode:#$01D6; Attr:laLower; CaseCode:#$01D5), // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
  2803. (Unicode:#$01D7; Attr:laUpper; CaseCode:#$01D8), // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
  2804. (Unicode:#$01D8; Attr:laLower; CaseCode:#$01D7), // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
  2805. (Unicode:#$01D9; Attr:laUpper; CaseCode:#$01DA), // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
  2806. (Unicode:#$01DA; Attr:laLower; CaseCode:#$01D9), // LATIN SMALL LETTER U WITH DIAERESIS AND CARON
  2807. (Unicode:#$01DB; Attr:laUpper; CaseCode:#$01DC), // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
  2808. (Unicode:#$01DC; Attr:laLower; CaseCode:#$01DB), // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
  2809. (Unicode:#$01DD; Attr:laLower; CaseCode:#$018E), // LATIN SMALL LETTER TURNED E
  2810. (Unicode:#$01DE; Attr:laUpper; CaseCode:#$01DF), // LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
  2811. (Unicode:#$01DF; Attr:laLower; CaseCode:#$01DE), // LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
  2812. (Unicode:#$01E0; Attr:laUpper; CaseCode:#$01E1), // LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
  2813. (Unicode:#$01E1; Attr:laLower; CaseCode:#$01E0), // LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
  2814. (Unicode:#$01E2; Attr:laUpper; CaseCode:#$01E3), // LATIN CAPITAL LETTER AE WITH MACRON
  2815. (Unicode:#$01E3; Attr:laLower; CaseCode:#$01E2), // LATIN SMALL LETTER AE WITH MACRON
  2816. (Unicode:#$01E4; Attr:laUpper; CaseCode:#$01E5), // LATIN CAPITAL LETTER G WITH STROKE
  2817. (Unicode:#$01E5; Attr:laLower; CaseCode:#$01E4), // LATIN SMALL LETTER G WITH STROKE
  2818. (Unicode:#$01E6; Attr:laUpper; CaseCode:#$01E7), // LATIN CAPITAL LETTER G WITH CARON
  2819. (Unicode:#$01E7; Attr:laLower; CaseCode:#$01E6), // LATIN SMALL LETTER G WITH CARON
  2820. (Unicode:#$01E8; Attr:laUpper; CaseCode:#$01E9), // LATIN CAPITAL LETTER K WITH CARON
  2821. (Unicode:#$01E9; Attr:laLower; CaseCode:#$01E8), // LATIN SMALL LETTER K WITH CARON
  2822. (Unicode:#$01EA; Attr:laUpper; CaseCode:#$01EB), // LATIN CAPITAL LETTER O WITH OGONEK
  2823. (Unicode:#$01EB; Attr:laLower; CaseCode:#$01EA), // LATIN SMALL LETTER O WITH OGONEK
  2824. (Unicode:#$01EC; Attr:laUpper; CaseCode:#$01ED), // LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
  2825. (Unicode:#$01ED; Attr:laLower; CaseCode:#$01EC), // LATIN SMALL LETTER O WITH OGONEK AND MACRON
  2826. (Unicode:#$01EE; Attr:laUpper; CaseCode:#$01EF), // LATIN CAPITAL LETTER EZH WITH CARON
  2827. (Unicode:#$01EF; Attr:laLower; CaseCode:#$01EE), // LATIN SMALL LETTER EZH WITH CARON
  2828. (Unicode:#$01F0; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER J WITH CARON
  2829. (Unicode:#$01F1; Attr:laUpper; CaseCode:#$01F3), // LATIN CAPITAL LETTER DZ
  2830. (Unicode:#$01F3; Attr:laLower; CaseCode:#$01F1), // LATIN SMALL LETTER DZ
  2831. (Unicode:#$01F4; Attr:laUpper; CaseCode:#$01F5), // LATIN CAPITAL LETTER G WITH ACUTE
  2832. (Unicode:#$01F5; Attr:laLower; CaseCode:#$01F4), // LATIN SMALL LETTER G WITH ACUTE
  2833. (Unicode:#$01F6; Attr:laUpper; CaseCode:#$0195), // LATIN CAPITAL LETTER HWAIR
  2834. (Unicode:#$01F7; Attr:laUpper; CaseCode:#$01BF), // LATIN CAPITAL LETTER WYNN
  2835. (Unicode:#$01F8; Attr:laUpper; CaseCode:#$01F9), // LATIN CAPITAL LETTER N WITH GRAVE
  2836. (Unicode:#$01F9; Attr:laLower; CaseCode:#$01F8), // LATIN SMALL LETTER N WITH GRAVE
  2837. (Unicode:#$01FA; Attr:laUpper; CaseCode:#$01FB), // LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
  2838. (Unicode:#$01FB; Attr:laLower; CaseCode:#$01FA), // LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
  2839. (Unicode:#$01FC; Attr:laUpper; CaseCode:#$01FD), // LATIN CAPITAL LETTER AE WITH ACUTE
  2840. (Unicode:#$01FD; Attr:laLower; CaseCode:#$01FC), // LATIN SMALL LETTER AE WITH ACUTE
  2841. (Unicode:#$01FE; Attr:laUpper; CaseCode:#$01FF), // LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
  2842. (Unicode:#$01FF; Attr:laLower; CaseCode:#$01FE), // LATIN SMALL LETTER O WITH STROKE AND ACUTE
  2843. (Unicode:#$0200; Attr:laUpper; CaseCode:#$0201), // LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
  2844. (Unicode:#$0201; Attr:laLower; CaseCode:#$0200), // LATIN SMALL LETTER A WITH DOUBLE GRAVE
  2845. (Unicode:#$0202; Attr:laUpper; CaseCode:#$0203), // LATIN CAPITAL LETTER A WITH INVERTED BREVE
  2846. (Unicode:#$0203; Attr:laLower; CaseCode:#$0202), // LATIN SMALL LETTER A WITH INVERTED BREVE
  2847. (Unicode:#$0204; Attr:laUpper; CaseCode:#$0205), // LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
  2848. (Unicode:#$0205; Attr:laLower; CaseCode:#$0204), // LATIN SMALL LETTER E WITH DOUBLE GRAVE
  2849. (Unicode:#$0206; Attr:laUpper; CaseCode:#$0207), // LATIN CAPITAL LETTER E WITH INVERTED BREVE
  2850. (Unicode:#$0207; Attr:laLower; CaseCode:#$0206), // LATIN SMALL LETTER E WITH INVERTED BREVE
  2851. (Unicode:#$0208; Attr:laUpper; CaseCode:#$0209), // LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
  2852. (Unicode:#$0209; Attr:laLower; CaseCode:#$0208), // LATIN SMALL LETTER I WITH DOUBLE GRAVE
  2853. (Unicode:#$020A; Attr:laUpper; CaseCode:#$020B), // LATIN CAPITAL LETTER I WITH INVERTED BREVE
  2854. (Unicode:#$020B; Attr:laLower; CaseCode:#$020A), // LATIN SMALL LETTER I WITH INVERTED BREVE
  2855. (Unicode:#$020C; Attr:laUpper; CaseCode:#$020D), // LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
  2856. (Unicode:#$020D; Attr:laLower; CaseCode:#$020C), // LATIN SMALL LETTER O WITH DOUBLE GRAVE
  2857. (Unicode:#$020E; Attr:laUpper; CaseCode:#$020F), // LATIN CAPITAL LETTER O WITH INVERTED BREVE
  2858. (Unicode:#$020F; Attr:laLower; CaseCode:#$020E), // LATIN SMALL LETTER O WITH INVERTED BREVE
  2859. (Unicode:#$0210; Attr:laUpper; CaseCode:#$0211), // LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
  2860. (Unicode:#$0211; Attr:laLower; CaseCode:#$0210), // LATIN SMALL LETTER R WITH DOUBLE GRAVE
  2861. (Unicode:#$0212; Attr:laUpper; CaseCode:#$0213), // LATIN CAPITAL LETTER R WITH INVERTED BREVE
  2862. (Unicode:#$0213; Attr:laLower; CaseCode:#$0212), // LATIN SMALL LETTER R WITH INVERTED BREVE
  2863. (Unicode:#$0214; Attr:laUpper; CaseCode:#$0215), // LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
  2864. (Unicode:#$0215; Attr:laLower; CaseCode:#$0214), // LATIN SMALL LETTER U WITH DOUBLE GRAVE
  2865. (Unicode:#$0216; Attr:laUpper; CaseCode:#$0217), // LATIN CAPITAL LETTER U WITH INVERTED BREVE
  2866. (Unicode:#$0217; Attr:laLower; CaseCode:#$0216), // LATIN SMALL LETTER U WITH INVERTED BREVE
  2867. (Unicode:#$0218; Attr:laUpper; CaseCode:#$0219), // LATIN CAPITAL LETTER S WITH COMMA BELOW
  2868. (Unicode:#$0219; Attr:laLower; CaseCode:#$0218), // LATIN SMALL LETTER S WITH COMMA BELOW
  2869. (Unicode:#$021A; Attr:laUpper; CaseCode:#$021B), // LATIN CAPITAL LETTER T WITH COMMA BELOW
  2870. (Unicode:#$021B; Attr:laLower; CaseCode:#$021A), // LATIN SMALL LETTER T WITH COMMA BELOW
  2871. (Unicode:#$021C; Attr:laUpper; CaseCode:#$021D), // LATIN CAPITAL LETTER YOGH
  2872. (Unicode:#$021D; Attr:laLower; CaseCode:#$021C), // LATIN SMALL LETTER YOGH
  2873. (Unicode:#$021E; Attr:laUpper; CaseCode:#$021F), // LATIN CAPITAL LETTER H WITH CARON
  2874. (Unicode:#$021F; Attr:laLower; CaseCode:#$021E), // LATIN SMALL LETTER H WITH CARON
  2875. (Unicode:#$0222; Attr:laUpper; CaseCode:#$0223), // LATIN CAPITAL LETTER OU
  2876. (Unicode:#$0223; Attr:laLower; CaseCode:#$0222), // LATIN SMALL LETTER OU
  2877. (Unicode:#$0224; Attr:laUpper; CaseCode:#$0225), // LATIN CAPITAL LETTER Z WITH HOOK
  2878. (Unicode:#$0225; Attr:laLower; CaseCode:#$0224), // LATIN SMALL LETTER Z WITH HOOK
  2879. (Unicode:#$0226; Attr:laUpper; CaseCode:#$0227), // LATIN CAPITAL LETTER A WITH DOT ABOVE
  2880. (Unicode:#$0227; Attr:laLower; CaseCode:#$0226), // LATIN SMALL LETTER A WITH DOT ABOVE
  2881. (Unicode:#$0228; Attr:laUpper; CaseCode:#$0229), // LATIN CAPITAL LETTER E WITH CEDILLA
  2882. (Unicode:#$0229; Attr:laLower; CaseCode:#$0228), // LATIN SMALL LETTER E WITH CEDILLA
  2883. (Unicode:#$022A; Attr:laUpper; CaseCode:#$022B), // LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
  2884. (Unicode:#$022B; Attr:laLower; CaseCode:#$022A), // LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
  2885. (Unicode:#$022C; Attr:laUpper; CaseCode:#$022D), // LATIN CAPITAL LETTER O WITH TILDE AND MACRON
  2886. (Unicode:#$022D; Attr:laLower; CaseCode:#$022C), // LATIN SMALL LETTER O WITH TILDE AND MACRON
  2887. (Unicode:#$022E; Attr:laUpper; CaseCode:#$022F), // LATIN CAPITAL LETTER O WITH DOT ABOVE
  2888. (Unicode:#$022F; Attr:laLower; CaseCode:#$022E), // LATIN SMALL LETTER O WITH DOT ABOVE
  2889. (Unicode:#$0230; Attr:laUpper; CaseCode:#$0231), // LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
  2890. (Unicode:#$0231; Attr:laLower; CaseCode:#$0230), // LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
  2891. (Unicode:#$0232; Attr:laUpper; CaseCode:#$0233), // LATIN CAPITAL LETTER Y WITH MACRON
  2892. (Unicode:#$0233; Attr:laLower; CaseCode:#$0232), // LATIN SMALL LETTER Y WITH MACRON
  2893. (Unicode:#$0250; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED A
  2894. (Unicode:#$0251; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER ALPHA
  2895. (Unicode:#$0252; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED ALPHA
  2896. (Unicode:#$0253; Attr:laLower; CaseCode:#$0181), // LATIN SMALL LETTER B WITH HOOK
  2897. (Unicode:#$0254; Attr:laLower; CaseCode:#$0186), // LATIN SMALL LETTER OPEN O
  2898. (Unicode:#$0255; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER C WITH CURL
  2899. (Unicode:#$0256; Attr:laLower; CaseCode:#$0189), // LATIN SMALL LETTER D WITH TAIL
  2900. (Unicode:#$0257; Attr:laLower; CaseCode:#$018A), // LATIN SMALL LETTER D WITH HOOK
  2901. (Unicode:#$0258; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER REVERSED E
  2902. (Unicode:#$0259; Attr:laLower; CaseCode:#$018F), // LATIN SMALL LETTER SCHWA
  2903. (Unicode:#$025A; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER SCHWA WITH HOOK
  2904. (Unicode:#$025B; Attr:laLower; CaseCode:#$0190), // LATIN SMALL LETTER OPEN E
  2905. (Unicode:#$025C; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER REVERSED OPEN E
  2906. (Unicode:#$025D; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
  2907. (Unicode:#$025E; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER CLOSED REVERSED OPEN E
  2908. (Unicode:#$025F; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER DOTLESS J WITH STROKE
  2909. (Unicode:#$0260; Attr:laLower; CaseCode:#$0193), // LATIN SMALL LETTER G WITH HOOK
  2910. (Unicode:#$0261; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER SCRIPT G
  2911. (Unicode:#$0262; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL G
  2912. (Unicode:#$0263; Attr:laLower; CaseCode:#$0194), // LATIN SMALL LETTER GAMMA
  2913. (Unicode:#$0264; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER RAMS HORN
  2914. (Unicode:#$0265; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED H
  2915. (Unicode:#$0266; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER H WITH HOOK
  2916. (Unicode:#$0267; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER HENG WITH HOOK
  2917. (Unicode:#$0268; Attr:laLower; CaseCode:#$0197), // LATIN SMALL LETTER I WITH STROKE
  2918. (Unicode:#$0269; Attr:laLower; CaseCode:#$0196), // LATIN SMALL LETTER IOTA
  2919. (Unicode:#$026A; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL I
  2920. (Unicode:#$026B; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER L WITH MIDDLE TILDE
  2921. (Unicode:#$026C; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER L WITH BELT
  2922. (Unicode:#$026D; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER L WITH RETROFLEX HOOK
  2923. (Unicode:#$026E; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER LEZH
  2924. (Unicode:#$026F; Attr:laLower; CaseCode:#$019C), // LATIN SMALL LETTER TURNED M
  2925. (Unicode:#$0270; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED M WITH LONG LEG
  2926. (Unicode:#$0271; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER M WITH HOOK
  2927. (Unicode:#$0272; Attr:laLower; CaseCode:#$019D), // LATIN SMALL LETTER N WITH LEFT HOOK
  2928. (Unicode:#$0273; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER N WITH RETROFLEX HOOK
  2929. (Unicode:#$0274; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL N
  2930. (Unicode:#$0275; Attr:laLower; CaseCode:#$019F), // LATIN SMALL LETTER BARRED O
  2931. (Unicode:#$0276; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL OE
  2932. (Unicode:#$0277; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER CLOSED OMEGA
  2933. (Unicode:#$0278; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER PHI
  2934. (Unicode:#$0279; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED R
  2935. (Unicode:#$027A; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED R WITH LONG LEG
  2936. (Unicode:#$027B; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED R WITH HOOK
  2937. (Unicode:#$027C; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER R WITH LONG LEG
  2938. (Unicode:#$027D; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER R WITH TAIL
  2939. (Unicode:#$027E; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER R WITH FISHHOOK
  2940. (Unicode:#$027F; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER REVERSED R WITH FISHHOOK
  2941. (Unicode:#$0280; Attr:laLower; CaseCode:#$01A6), // LATIN LETTER SMALL CAPITAL R
  2942. (Unicode:#$0281; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL INVERTED R
  2943. (Unicode:#$0282; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER S WITH HOOK
  2944. (Unicode:#$0283; Attr:laLower; CaseCode:#$01A9), // LATIN SMALL LETTER ESH
  2945. (Unicode:#$0284; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
  2946. (Unicode:#$0285; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER SQUAT REVERSED ESH
  2947. (Unicode:#$0286; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER ESH WITH CURL
  2948. (Unicode:#$0287; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED T
  2949. (Unicode:#$0288; Attr:laLower; CaseCode:#$01AE), // LATIN SMALL LETTER T WITH RETROFLEX HOOK
  2950. (Unicode:#$0289; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER U BAR
  2951. (Unicode:#$028A; Attr:laLower; CaseCode:#$01B1), // LATIN SMALL LETTER UPSILON
  2952. (Unicode:#$028B; Attr:laLower; CaseCode:#$01B2), // LATIN SMALL LETTER V WITH HOOK
  2953. (Unicode:#$028C; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED V
  2954. (Unicode:#$028D; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED W
  2955. (Unicode:#$028E; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED Y
  2956. (Unicode:#$028F; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL Y
  2957. (Unicode:#$0290; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER Z WITH RETROFLEX HOOK
  2958. (Unicode:#$0291; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER Z WITH CURL
  2959. (Unicode:#$0292; Attr:laLower; CaseCode:#$01B7), // LATIN SMALL LETTER EZH
  2960. (Unicode:#$0293; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER EZH WITH CURL
  2961. (Unicode:#$0294; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER GLOTTAL STOP
  2962. (Unicode:#$0295; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER PHARYNGEAL VOICED FRICATIVE
  2963. (Unicode:#$0296; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER INVERTED GLOTTAL STOP
  2964. (Unicode:#$0297; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER STRETCHED C
  2965. (Unicode:#$0298; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER BILABIAL CLICK
  2966. (Unicode:#$0299; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL B
  2967. (Unicode:#$029A; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER CLOSED OPEN E
  2968. (Unicode:#$029B; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL G WITH HOOK
  2969. (Unicode:#$029C; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL H
  2970. (Unicode:#$029D; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER J WITH CROSSED-TAIL
  2971. (Unicode:#$029E; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TURNED K
  2972. (Unicode:#$029F; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER SMALL CAPITAL L
  2973. (Unicode:#$02A0; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER Q WITH HOOK
  2974. (Unicode:#$02A1; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER GLOTTAL STOP WITH STROKE
  2975. (Unicode:#$02A2; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE
  2976. (Unicode:#$02A3; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER DZ DIGRAPH
  2977. (Unicode:#$02A4; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER DEZH DIGRAPH
  2978. (Unicode:#$02A5; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER DZ DIGRAPH WITH CURL
  2979. (Unicode:#$02A6; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TS DIGRAPH
  2980. (Unicode:#$02A7; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TESH DIGRAPH
  2981. (Unicode:#$02A8; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER TC DIGRAPH WITH CURL
  2982. (Unicode:#$02A9; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER FENG DIGRAPH
  2983. (Unicode:#$02AA; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER LS DIGRAPH
  2984. (Unicode:#$02AB; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER LZ DIGRAPH
  2985. (Unicode:#$02AC; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER BILABIAL PERCUSSIVE
  2986. (Unicode:#$02AD; Attr:laLower; CaseCode:#$FFFF), // LATIN LETTER BIDENTAL PERCUSSIVE
  2987. (Unicode:#$0386; Attr:laUpper; CaseCode:#$03AC), // GREEK CAPITAL LETTER ALPHA WITH TONOS
  2988. (Unicode:#$0388; Attr:laUpper; CaseCode:#$03AD), // GREEK CAPITAL LETTER EPSILON WITH TONOS
  2989. (Unicode:#$0389; Attr:laUpper; CaseCode:#$03AE), // GREEK CAPITAL LETTER ETA WITH TONOS
  2990. (Unicode:#$038A; Attr:laUpper; CaseCode:#$03AF), // GREEK CAPITAL LETTER IOTA WITH TONOS
  2991. (Unicode:#$038C; Attr:laUpper; CaseCode:#$03CC), // GREEK CAPITAL LETTER OMICRON WITH TONOS
  2992. (Unicode:#$038E; Attr:laUpper; CaseCode:#$03CD), // GREEK CAPITAL LETTER UPSILON WITH TONOS
  2993. (Unicode:#$038F; Attr:laUpper; CaseCode:#$03CE), // GREEK CAPITAL LETTER OMEGA WITH TONOS
  2994. (Unicode:#$0390; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
  2995. (Unicode:#$0391; Attr:laUpper; CaseCode:#$03B1), // GREEK CAPITAL LETTER ALPHA
  2996. (Unicode:#$0392; Attr:laUpper; CaseCode:#$03B2), // GREEK CAPITAL LETTER BETA
  2997. (Unicode:#$0393; Attr:laUpper; CaseCode:#$03B3), // GREEK CAPITAL LETTER GAMMA
  2998. (Unicode:#$0394; Attr:laUpper; CaseCode:#$03B4), // GREEK CAPITAL LETTER DELTA
  2999. (Unicode:#$0395; Attr:laUpper; CaseCode:#$03B5), // GREEK CAPITAL LETTER EPSILON
  3000. (Unicode:#$0396; Attr:laUpper; CaseCode:#$03B6), // GREEK CAPITAL LETTER ZETA
  3001. (Unicode:#$0397; Attr:laUpper; CaseCode:#$03B7), // GREEK CAPITAL LETTER ETA
  3002. (Unicode:#$0398; Attr:laUpper; CaseCode:#$03B8), // GREEK CAPITAL LETTER THETA
  3003. (Unicode:#$0399; Attr:laUpper; CaseCode:#$03B9), // GREEK CAPITAL LETTER IOTA
  3004. (Unicode:#$039A; Attr:laUpper; CaseCode:#$03BA), // GREEK CAPITAL LETTER KAPPA
  3005. (Unicode:#$039B; Attr:laUpper; CaseCode:#$03BB), // GREEK CAPITAL LETTER LAMDA
  3006. (Unicode:#$039C; Attr:laUpper; CaseCode:#$03BC), // GREEK CAPITAL LETTER MU
  3007. (Unicode:#$039D; Attr:laUpper; CaseCode:#$03BD), // GREEK CAPITAL LETTER NU
  3008. (Unicode:#$039E; Attr:laUpper; CaseCode:#$03BE), // GREEK CAPITAL LETTER XI
  3009. (Unicode:#$039F; Attr:laUpper; CaseCode:#$03BF), // GREEK CAPITAL LETTER OMICRON
  3010. (Unicode:#$03A0; Attr:laUpper; CaseCode:#$03C0), // GREEK CAPITAL LETTER PI
  3011. (Unicode:#$03A1; Attr:laUpper; CaseCode:#$03C1), // GREEK CAPITAL LETTER RHO
  3012. (Unicode:#$03A3; Attr:laUpper; CaseCode:#$03C3), // GREEK CAPITAL LETTER SIGMA
  3013. (Unicode:#$03A4; Attr:laUpper; CaseCode:#$03C4), // GREEK CAPITAL LETTER TAU
  3014. (Unicode:#$03A5; Attr:laUpper; CaseCode:#$03C5), // GREEK CAPITAL LETTER UPSILON
  3015. (Unicode:#$03A6; Attr:laUpper; CaseCode:#$03C6), // GREEK CAPITAL LETTER PHI
  3016. (Unicode:#$03A7; Attr:laUpper; CaseCode:#$03C7), // GREEK CAPITAL LETTER CHI
  3017. (Unicode:#$03A8; Attr:laUpper; CaseCode:#$03C8), // GREEK CAPITAL LETTER PSI
  3018. (Unicode:#$03A9; Attr:laUpper; CaseCode:#$03C9), // GREEK CAPITAL LETTER OMEGA
  3019. (Unicode:#$03AA; Attr:laUpper; CaseCode:#$03CA), // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
  3020. (Unicode:#$03AB; Attr:laUpper; CaseCode:#$03CB), // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
  3021. (Unicode:#$03AC; Attr:laLower; CaseCode:#$0386), // GREEK SMALL LETTER ALPHA WITH TONOS
  3022. (Unicode:#$03AD; Attr:laLower; CaseCode:#$0388), // GREEK SMALL LETTER EPSILON WITH TONOS
  3023. (Unicode:#$03AE; Attr:laLower; CaseCode:#$0389), // GREEK SMALL LETTER ETA WITH TONOS
  3024. (Unicode:#$03AF; Attr:laLower; CaseCode:#$038A), // GREEK SMALL LETTER IOTA WITH TONOS
  3025. (Unicode:#$03B0; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
  3026. (Unicode:#$03B1; Attr:laLower; CaseCode:#$0391), // GREEK SMALL LETTER ALPHA
  3027. (Unicode:#$03B2; Attr:laLower; CaseCode:#$0392), // GREEK SMALL LETTER BETA
  3028. (Unicode:#$03B3; Attr:laLower; CaseCode:#$0393), // GREEK SMALL LETTER GAMMA
  3029. (Unicode:#$03B4; Attr:laLower; CaseCode:#$0394), // GREEK SMALL LETTER DELTA
  3030. (Unicode:#$03B5; Attr:laLower; CaseCode:#$0395), // GREEK SMALL LETTER EPSILON
  3031. (Unicode:#$03B6; Attr:laLower; CaseCode:#$0396), // GREEK SMALL LETTER ZETA
  3032. (Unicode:#$03B7; Attr:laLower; CaseCode:#$0397), // GREEK SMALL LETTER ETA
  3033. (Unicode:#$03B8; Attr:laLower; CaseCode:#$0398), // GREEK SMALL LETTER THETA
  3034. (Unicode:#$03B9; Attr:laLower; CaseCode:#$0399), // GREEK SMALL LETTER IOTA
  3035. (Unicode:#$03BA; Attr:laLower; CaseCode:#$039A), // GREEK SMALL LETTER KAPPA
  3036. (Unicode:#$03BB; Attr:laLower; CaseCode:#$039B), // GREEK SMALL LETTER LAMDA
  3037. (Unicode:#$03BC; Attr:laLower; CaseCode:#$039C), // GREEK SMALL LETTER MU
  3038. (Unicode:#$03BD; Attr:laLower; CaseCode:#$039D), // GREEK SMALL LETTER NU
  3039. (Unicode:#$03BE; Attr:laLower; CaseCode:#$039E), // GREEK SMALL LETTER XI
  3040. (Unicode:#$03BF; Attr:laLower; CaseCode:#$039F), // GREEK SMALL LETTER OMICRON
  3041. (Unicode:#$03C0; Attr:laLower; CaseCode:#$03A0), // GREEK SMALL LETTER PI
  3042. (Unicode:#$03C1; Attr:laLower; CaseCode:#$03A1), // GREEK SMALL LETTER RHO
  3043. (Unicode:#$03C2; Attr:laLower; CaseCode:#$03A3), // GREEK SMALL LETTER FINAL SIGMA
  3044. (Unicode:#$03C3; Attr:laLower; CaseCode:#$03A3), // GREEK SMALL LETTER SIGMA
  3045. (Unicode:#$03C4; Attr:laLower; CaseCode:#$03A4), // GREEK SMALL LETTER TAU
  3046. (Unicode:#$03C5; Attr:laLower; CaseCode:#$03A5), // GREEK SMALL LETTER UPSILON
  3047. (Unicode:#$03C6; Attr:laLower; CaseCode:#$03A6), // GREEK SMALL LETTER PHI
  3048. (Unicode:#$03C7; Attr:laLower; CaseCode:#$03A7), // GREEK SMALL LETTER CHI
  3049. (Unicode:#$03C8; Attr:laLower; CaseCode:#$03A8), // GREEK SMALL LETTER PSI
  3050. (Unicode:#$03C9; Attr:laLower; CaseCode:#$03A9), // GREEK SMALL LETTER OMEGA
  3051. (Unicode:#$03CA; Attr:laLower; CaseCode:#$03AA), // GREEK SMALL LETTER IOTA WITH DIALYTIKA
  3052. (Unicode:#$03CB; Attr:laLower; CaseCode:#$03AB), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA
  3053. (Unicode:#$03CC; Attr:laLower; CaseCode:#$038C), // GREEK SMALL LETTER OMICRON WITH TONOS
  3054. (Unicode:#$03CD; Attr:laLower; CaseCode:#$038E), // GREEK SMALL LETTER UPSILON WITH TONOS
  3055. (Unicode:#$03CE; Attr:laLower; CaseCode:#$038F), // GREEK SMALL LETTER OMEGA WITH TONOS
  3056. (Unicode:#$03D0; Attr:laLower; CaseCode:#$0392), // GREEK BETA SYMBOL
  3057. (Unicode:#$03D1; Attr:laLower; CaseCode:#$0398), // GREEK THETA SYMBOL
  3058. (Unicode:#$03D2; Attr:laUpper; CaseCode:#$FFFF), // GREEK UPSILON WITH HOOK SYMBOL
  3059. (Unicode:#$03D3; Attr:laUpper; CaseCode:#$FFFF), // GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
  3060. (Unicode:#$03D4; Attr:laUpper; CaseCode:#$FFFF), // GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
  3061. (Unicode:#$03D5; Attr:laLower; CaseCode:#$03A6), // GREEK PHI SYMBOL
  3062. (Unicode:#$03D6; Attr:laLower; CaseCode:#$03A0), // GREEK PI SYMBOL
  3063. (Unicode:#$03D7; Attr:laLower; CaseCode:#$FFFF), // GREEK KAI SYMBOL
  3064. (Unicode:#$03DA; Attr:laUpper; CaseCode:#$03DB), // GREEK LETTER STIGMA
  3065. (Unicode:#$03DB; Attr:laLower; CaseCode:#$03DA), // GREEK SMALL LETTER STIGMA
  3066. (Unicode:#$03DC; Attr:laUpper; CaseCode:#$03DD), // GREEK LETTER DIGAMMA
  3067. (Unicode:#$03DD; Attr:laLower; CaseCode:#$03DC), // GREEK SMALL LETTER DIGAMMA
  3068. (Unicode:#$03DE; Attr:laUpper; CaseCode:#$03DF), // GREEK LETTER KOPPA
  3069. (Unicode:#$03DF; Attr:laLower; CaseCode:#$03DE), // GREEK SMALL LETTER KOPPA
  3070. (Unicode:#$03E0; Attr:laUpper; CaseCode:#$03E1), // GREEK LETTER SAMPI
  3071. (Unicode:#$03E1; Attr:laLower; CaseCode:#$03E0), // GREEK SMALL LETTER SAMPI
  3072. (Unicode:#$03E2; Attr:laUpper; CaseCode:#$03E3), // COPTIC CAPITAL LETTER SHEI
  3073. (Unicode:#$03E3; Attr:laLower; CaseCode:#$03E2), // COPTIC SMALL LETTER SHEI
  3074. (Unicode:#$03E4; Attr:laUpper; CaseCode:#$03E5), // COPTIC CAPITAL LETTER FEI
  3075. (Unicode:#$03E5; Attr:laLower; CaseCode:#$03E4), // COPTIC SMALL LETTER FEI
  3076. (Unicode:#$03E6; Attr:laUpper; CaseCode:#$03E7), // COPTIC CAPITAL LETTER KHEI
  3077. (Unicode:#$03E7; Attr:laLower; CaseCode:#$03E6), // COPTIC SMALL LETTER KHEI
  3078. (Unicode:#$03E8; Attr:laUpper; CaseCode:#$03E9), // COPTIC CAPITAL LETTER HORI
  3079. (Unicode:#$03E9; Attr:laLower; CaseCode:#$03E8), // COPTIC SMALL LETTER HORI
  3080. (Unicode:#$03EA; Attr:laUpper; CaseCode:#$03EB), // COPTIC CAPITAL LETTER GANGIA
  3081. (Unicode:#$03EB; Attr:laLower; CaseCode:#$03EA), // COPTIC SMALL LETTER GANGIA
  3082. (Unicode:#$03EC; Attr:laUpper; CaseCode:#$03ED), // COPTIC CAPITAL LETTER SHIMA
  3083. (Unicode:#$03ED; Attr:laLower; CaseCode:#$03EC), // COPTIC SMALL LETTER SHIMA
  3084. (Unicode:#$03EE; Attr:laUpper; CaseCode:#$03EF), // COPTIC CAPITAL LETTER DEI
  3085. (Unicode:#$03EF; Attr:laLower; CaseCode:#$03EE), // COPTIC SMALL LETTER DEI
  3086. (Unicode:#$03F0; Attr:laLower; CaseCode:#$039A), // GREEK KAPPA SYMBOL
  3087. (Unicode:#$03F1; Attr:laLower; CaseCode:#$03A1), // GREEK RHO SYMBOL
  3088. (Unicode:#$03F2; Attr:laLower; CaseCode:#$03A3), // GREEK LUNATE SIGMA SYMBOL
  3089. (Unicode:#$03F3; Attr:laLower; CaseCode:#$FFFF), // GREEK LETTER YOT
  3090. (Unicode:#$03F4; Attr:laUpper; CaseCode:#$03B8), // GREEK CAPITAL THETA SYMBOL
  3091. (Unicode:#$03F5; Attr:laLower; CaseCode:#$0395), // GREEK LUNATE EPSILON SYMBOL
  3092. (Unicode:#$0400; Attr:laUpper; CaseCode:#$0450), // CYRILLIC CAPITAL LETTER IE WITH GRAVE
  3093. (Unicode:#$0401; Attr:laUpper; CaseCode:#$0451), // CYRILLIC CAPITAL LETTER IO
  3094. (Unicode:#$0402; Attr:laUpper; CaseCode:#$0452), // CYRILLIC CAPITAL LETTER DJE
  3095. (Unicode:#$0403; Attr:laUpper; CaseCode:#$0453), // CYRILLIC CAPITAL LETTER GJE
  3096. (Unicode:#$0404; Attr:laUpper; CaseCode:#$0454), // CYRILLIC CAPITAL LETTER UKRAINIAN IE
  3097. (Unicode:#$0405; Attr:laUpper; CaseCode:#$0455), // CYRILLIC CAPITAL LETTER DZE
  3098. (Unicode:#$0406; Attr:laUpper; CaseCode:#$0456), // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
  3099. (Unicode:#$0407; Attr:laUpper; CaseCode:#$0457), // CYRILLIC CAPITAL LETTER YI
  3100. (Unicode:#$0408; Attr:laUpper; CaseCode:#$0458), // CYRILLIC CAPITAL LETTER JE
  3101. (Unicode:#$0409; Attr:laUpper; CaseCode:#$0459), // CYRILLIC CAPITAL LETTER LJE
  3102. (Unicode:#$040A; Attr:laUpper; CaseCode:#$045A), // CYRILLIC CAPITAL LETTER NJE
  3103. (Unicode:#$040B; Attr:laUpper; CaseCode:#$045B), // CYRILLIC CAPITAL LETTER TSHE
  3104. (Unicode:#$040C; Attr:laUpper; CaseCode:#$045C), // CYRILLIC CAPITAL LETTER KJE
  3105. (Unicode:#$040D; Attr:laUpper; CaseCode:#$045D), // CYRILLIC CAPITAL LETTER I WITH GRAVE
  3106. (Unicode:#$040E; Attr:laUpper; CaseCode:#$045E), // CYRILLIC CAPITAL LETTER SHORT U
  3107. (Unicode:#$040F; Attr:laUpper; CaseCode:#$045F), // CYRILLIC CAPITAL LETTER DZHE
  3108. (Unicode:#$0410; Attr:laUpper; CaseCode:#$0430), // CYRILLIC CAPITAL LETTER A
  3109. (Unicode:#$0411; Attr:laUpper; CaseCode:#$0431), // CYRILLIC CAPITAL LETTER BE
  3110. (Unicode:#$0412; Attr:laUpper; CaseCode:#$0432), // CYRILLIC CAPITAL LETTER VE
  3111. (Unicode:#$0413; Attr:laUpper; CaseCode:#$0433), // CYRILLIC CAPITAL LETTER GHE
  3112. (Unicode:#$0414; Attr:laUpper; CaseCode:#$0434), // CYRILLIC CAPITAL LETTER DE
  3113. (Unicode:#$0415; Attr:laUpper; CaseCode:#$0435), // CYRILLIC CAPITAL LETTER IE
  3114. (Unicode:#$0416; Attr:laUpper; CaseCode:#$0436), // CYRILLIC CAPITAL LETTER ZHE
  3115. (Unicode:#$0417; Attr:laUpper; CaseCode:#$0437), // CYRILLIC CAPITAL LETTER ZE
  3116. (Unicode:#$0418; Attr:laUpper; CaseCode:#$0438), // CYRILLIC CAPITAL LETTER I
  3117. (Unicode:#$0419; Attr:laUpper; CaseCode:#$0439), // CYRILLIC CAPITAL LETTER SHORT I
  3118. (Unicode:#$041A; Attr:laUpper; CaseCode:#$043A), // CYRILLIC CAPITAL LETTER KA
  3119. (Unicode:#$041B; Attr:laUpper; CaseCode:#$043B), // CYRILLIC CAPITAL LETTER EL
  3120. (Unicode:#$041C; Attr:laUpper; CaseCode:#$043C), // CYRILLIC CAPITAL LETTER EM
  3121. (Unicode:#$041D; Attr:laUpper; CaseCode:#$043D), // CYRILLIC CAPITAL LETTER EN
  3122. (Unicode:#$041E; Attr:laUpper; CaseCode:#$043E), // CYRILLIC CAPITAL LETTER O
  3123. (Unicode:#$041F; Attr:laUpper; CaseCode:#$043F), // CYRILLIC CAPITAL LETTER PE
  3124. (Unicode:#$0420; Attr:laUpper; CaseCode:#$0440), // CYRILLIC CAPITAL LETTER ER
  3125. (Unicode:#$0421; Attr:laUpper; CaseCode:#$0441), // CYRILLIC CAPITAL LETTER ES
  3126. (Unicode:#$0422; Attr:laUpper; CaseCode:#$0442), // CYRILLIC CAPITAL LETTER TE
  3127. (Unicode:#$0423; Attr:laUpper; CaseCode:#$0443), // CYRILLIC CAPITAL LETTER U
  3128. (Unicode:#$0424; Attr:laUpper; CaseCode:#$0444), // CYRILLIC CAPITAL LETTER EF
  3129. (Unicode:#$0425; Attr:laUpper; CaseCode:#$0445), // CYRILLIC CAPITAL LETTER HA
  3130. (Unicode:#$0426; Attr:laUpper; CaseCode:#$0446), // CYRILLIC CAPITAL LETTER TSE
  3131. (Unicode:#$0427; Attr:laUpper; CaseCode:#$0447), // CYRILLIC CAPITAL LETTER CHE
  3132. (Unicode:#$0428; Attr:laUpper; CaseCode:#$0448), // CYRILLIC CAPITAL LETTER SHA
  3133. (Unicode:#$0429; Attr:laUpper; CaseCode:#$0449), // CYRILLIC CAPITAL LETTER SHCHA
  3134. (Unicode:#$042A; Attr:laUpper; CaseCode:#$044A), // CYRILLIC CAPITAL LETTER HARD SIGN
  3135. (Unicode:#$042B; Attr:laUpper; CaseCode:#$044B), // CYRILLIC CAPITAL LETTER YERU
  3136. (Unicode:#$042C; Attr:laUpper; CaseCode:#$044C), // CYRILLIC CAPITAL LETTER SOFT SIGN
  3137. (Unicode:#$042D; Attr:laUpper; CaseCode:#$044D), // CYRILLIC CAPITAL LETTER E
  3138. (Unicode:#$042E; Attr:laUpper; CaseCode:#$044E), // CYRILLIC CAPITAL LETTER YU
  3139. (Unicode:#$042F; Attr:laUpper; CaseCode:#$044F), // CYRILLIC CAPITAL LETTER YA
  3140. (Unicode:#$0430; Attr:laLower; CaseCode:#$0410), // CYRILLIC SMALL LETTER A
  3141. (Unicode:#$0431; Attr:laLower; CaseCode:#$0411), // CYRILLIC SMALL LETTER BE
  3142. (Unicode:#$0432; Attr:laLower; CaseCode:#$0412), // CYRILLIC SMALL LETTER VE
  3143. (Unicode:#$0433; Attr:laLower; CaseCode:#$0413), // CYRILLIC SMALL LETTER GHE
  3144. (Unicode:#$0434; Attr:laLower; CaseCode:#$0414), // CYRILLIC SMALL LETTER DE
  3145. (Unicode:#$0435; Attr:laLower; CaseCode:#$0415), // CYRILLIC SMALL LETTER IE
  3146. (Unicode:#$0436; Attr:laLower; CaseCode:#$0416), // CYRILLIC SMALL LETTER ZHE
  3147. (Unicode:#$0437; Attr:laLower; CaseCode:#$0417), // CYRILLIC SMALL LETTER ZE
  3148. (Unicode:#$0438; Attr:laLower; CaseCode:#$0418), // CYRILLIC SMALL LETTER I
  3149. (Unicode:#$0439; Attr:laLower; CaseCode:#$0419), // CYRILLIC SMALL LETTER SHORT I
  3150. (Unicode:#$043A; Attr:laLower; CaseCode:#$041A), // CYRILLIC SMALL LETTER KA
  3151. (Unicode:#$043B; Attr:laLower; CaseCode:#$041B), // CYRILLIC SMALL LETTER EL
  3152. (Unicode:#$043C; Attr:laLower; CaseCode:#$041C), // CYRILLIC SMALL LETTER EM
  3153. (Unicode:#$043D; Attr:laLower; CaseCode:#$041D), // CYRILLIC SMALL LETTER EN
  3154. (Unicode:#$043E; Attr:laLower; CaseCode:#$041E), // CYRILLIC SMALL LETTER O
  3155. (Unicode:#$043F; Attr:laLower; CaseCode:#$041F), // CYRILLIC SMALL LETTER PE
  3156. (Unicode:#$0440; Attr:laLower; CaseCode:#$0420), // CYRILLIC SMALL LETTER ER
  3157. (Unicode:#$0441; Attr:laLower; CaseCode:#$0421), // CYRILLIC SMALL LETTER ES
  3158. (Unicode:#$0442; Attr:laLower; CaseCode:#$0422), // CYRILLIC SMALL LETTER TE
  3159. (Unicode:#$0443; Attr:laLower; CaseCode:#$0423), // CYRILLIC SMALL LETTER U
  3160. (Unicode:#$0444; Attr:laLower; CaseCode:#$0424), // CYRILLIC SMALL LETTER EF
  3161. (Unicode:#$0445; Attr:laLower; CaseCode:#$0425), // CYRILLIC SMALL LETTER HA
  3162. (Unicode:#$0446; Attr:laLower; CaseCode:#$0426), // CYRILLIC SMALL LETTER TSE
  3163. (Unicode:#$0447; Attr:laLower; CaseCode:#$0427), // CYRILLIC SMALL LETTER CHE
  3164. (Unicode:#$0448; Attr:laLower; CaseCode:#$0428), // CYRILLIC SMALL LETTER SHA
  3165. (Unicode:#$0449; Attr:laLower; CaseCode:#$0429), // CYRILLIC SMALL LETTER SHCHA
  3166. (Unicode:#$044A; Attr:laLower; CaseCode:#$042A), // CYRILLIC SMALL LETTER HARD SIGN
  3167. (Unicode:#$044B; Attr:laLower; CaseCode:#$042B), // CYRILLIC SMALL LETTER YERU
  3168. (Unicode:#$044C; Attr:laLower; CaseCode:#$042C), // CYRILLIC SMALL LETTER SOFT SIGN
  3169. (Unicode:#$044D; Attr:laLower; CaseCode:#$042D), // CYRILLIC SMALL LETTER E
  3170. (Unicode:#$044E; Attr:laLower; CaseCode:#$042E), // CYRILLIC SMALL LETTER YU
  3171. (Unicode:#$044F; Attr:laLower; CaseCode:#$042F), // CYRILLIC SMALL LETTER YA
  3172. (Unicode:#$0450; Attr:laLower; CaseCode:#$0400), // CYRILLIC SMALL LETTER IE WITH GRAVE
  3173. (Unicode:#$0451; Attr:laLower; CaseCode:#$0401), // CYRILLIC SMALL LETTER IO
  3174. (Unicode:#$0452; Attr:laLower; CaseCode:#$0402), // CYRILLIC SMALL LETTER DJE
  3175. (Unicode:#$0453; Attr:laLower; CaseCode:#$0403), // CYRILLIC SMALL LETTER GJE
  3176. (Unicode:#$0454; Attr:laLower; CaseCode:#$0404), // CYRILLIC SMALL LETTER UKRAINIAN IE
  3177. (Unicode:#$0455; Attr:laLower; CaseCode:#$0405), // CYRILLIC SMALL LETTER DZE
  3178. (Unicode:#$0456; Attr:laLower; CaseCode:#$0406), // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
  3179. (Unicode:#$0457; Attr:laLower; CaseCode:#$0407), // CYRILLIC SMALL LETTER YI
  3180. (Unicode:#$0458; Attr:laLower; CaseCode:#$0408), // CYRILLIC SMALL LETTER JE
  3181. (Unicode:#$0459; Attr:laLower; CaseCode:#$0409), // CYRILLIC SMALL LETTER LJE
  3182. (Unicode:#$045A; Attr:laLower; CaseCode:#$040A), // CYRILLIC SMALL LETTER NJE
  3183. (Unicode:#$045B; Attr:laLower; CaseCode:#$040B), // CYRILLIC SMALL LETTER TSHE
  3184. (Unicode:#$045C; Attr:laLower; CaseCode:#$040C), // CYRILLIC SMALL LETTER KJE
  3185. (Unicode:#$045D; Attr:laLower; CaseCode:#$040D), // CYRILLIC SMALL LETTER I WITH GRAVE
  3186. (Unicode:#$045E; Attr:laLower; CaseCode:#$040E), // CYRILLIC SMALL LETTER SHORT U
  3187. (Unicode:#$045F; Attr:laLower; CaseCode:#$040F), // CYRILLIC SMALL LETTER DZHE
  3188. (Unicode:#$0460; Attr:laUpper; CaseCode:#$0461), // CYRILLIC CAPITAL LETTER OMEGA
  3189. (Unicode:#$0461; Attr:laLower; CaseCode:#$0460), // CYRILLIC SMALL LETTER OMEGA
  3190. (Unicode:#$0462; Attr:laUpper; CaseCode:#$0463), // CYRILLIC CAPITAL LETTER YAT
  3191. (Unicode:#$0463; Attr:laLower; CaseCode:#$0462), // CYRILLIC SMALL LETTER YAT
  3192. (Unicode:#$0464; Attr:laUpper; CaseCode:#$0465), // CYRILLIC CAPITAL LETTER IOTIFIED E
  3193. (Unicode:#$0465; Attr:laLower; CaseCode:#$0464), // CYRILLIC SMALL LETTER IOTIFIED E
  3194. (Unicode:#$0466; Attr:laUpper; CaseCode:#$0467), // CYRILLIC CAPITAL LETTER LITTLE YUS
  3195. (Unicode:#$0467; Attr:laLower; CaseCode:#$0466), // CYRILLIC SMALL LETTER LITTLE YUS
  3196. (Unicode:#$0468; Attr:laUpper; CaseCode:#$0469), // CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
  3197. (Unicode:#$0469; Attr:laLower; CaseCode:#$0468), // CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS
  3198. (Unicode:#$046A; Attr:laUpper; CaseCode:#$046B), // CYRILLIC CAPITAL LETTER BIG YUS
  3199. (Unicode:#$046B; Attr:laLower; CaseCode:#$046A), // CYRILLIC SMALL LETTER BIG YUS
  3200. (Unicode:#$046C; Attr:laUpper; CaseCode:#$046D), // CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
  3201. (Unicode:#$046D; Attr:laLower; CaseCode:#$046C), // CYRILLIC SMALL LETTER IOTIFIED BIG YUS
  3202. (Unicode:#$046E; Attr:laUpper; CaseCode:#$046F), // CYRILLIC CAPITAL LETTER KSI
  3203. (Unicode:#$046F; Attr:laLower; CaseCode:#$046E), // CYRILLIC SMALL LETTER KSI
  3204. (Unicode:#$0470; Attr:laUpper; CaseCode:#$0471), // CYRILLIC CAPITAL LETTER PSI
  3205. (Unicode:#$0471; Attr:laLower; CaseCode:#$0470), // CYRILLIC SMALL LETTER PSI
  3206. (Unicode:#$0472; Attr:laUpper; CaseCode:#$0473), // CYRILLIC CAPITAL LETTER FITA
  3207. (Unicode:#$0473; Attr:laLower; CaseCode:#$0472), // CYRILLIC SMALL LETTER FITA
  3208. (Unicode:#$0474; Attr:laUpper; CaseCode:#$0475), // CYRILLIC CAPITAL LETTER IZHITSA
  3209. (Unicode:#$0475; Attr:laLower; CaseCode:#$0474), // CYRILLIC SMALL LETTER IZHITSA
  3210. (Unicode:#$0476; Attr:laUpper; CaseCode:#$0477), // CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
  3211. (Unicode:#$0477; Attr:laLower; CaseCode:#$0476), // CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
  3212. (Unicode:#$0478; Attr:laUpper; CaseCode:#$0479), // CYRILLIC CAPITAL LETTER UK
  3213. (Unicode:#$0479; Attr:laLower; CaseCode:#$0478), // CYRILLIC SMALL LETTER UK
  3214. (Unicode:#$047A; Attr:laUpper; CaseCode:#$047B), // CYRILLIC CAPITAL LETTER ROUND OMEGA
  3215. (Unicode:#$047B; Attr:laLower; CaseCode:#$047A), // CYRILLIC SMALL LETTER ROUND OMEGA
  3216. (Unicode:#$047C; Attr:laUpper; CaseCode:#$047D), // CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
  3217. (Unicode:#$047D; Attr:laLower; CaseCode:#$047C), // CYRILLIC SMALL LETTER OMEGA WITH TITLO
  3218. (Unicode:#$047E; Attr:laUpper; CaseCode:#$047F), // CYRILLIC CAPITAL LETTER OT
  3219. (Unicode:#$047F; Attr:laLower; CaseCode:#$047E), // CYRILLIC SMALL LETTER OT
  3220. (Unicode:#$0480; Attr:laUpper; CaseCode:#$0481), // CYRILLIC CAPITAL LETTER KOPPA
  3221. (Unicode:#$0481; Attr:laLower; CaseCode:#$0480), // CYRILLIC SMALL LETTER KOPPA
  3222. (Unicode:#$048C; Attr:laUpper; CaseCode:#$048D), // CYRILLIC CAPITAL LETTER SEMISOFT SIGN
  3223. (Unicode:#$048D; Attr:laLower; CaseCode:#$048C), // CYRILLIC SMALL LETTER SEMISOFT SIGN
  3224. (Unicode:#$048E; Attr:laUpper; CaseCode:#$048F), // CYRILLIC CAPITAL LETTER ER WITH TICK
  3225. (Unicode:#$048F; Attr:laLower; CaseCode:#$048E), // CYRILLIC SMALL LETTER ER WITH TICK
  3226. (Unicode:#$0490; Attr:laUpper; CaseCode:#$0491), // CYRILLIC CAPITAL LETTER GHE WITH UPTURN
  3227. (Unicode:#$0491; Attr:laLower; CaseCode:#$0490), // CYRILLIC SMALL LETTER GHE WITH UPTURN
  3228. (Unicode:#$0492; Attr:laUpper; CaseCode:#$0493), // CYRILLIC CAPITAL LETTER GHE WITH STROKE
  3229. (Unicode:#$0493; Attr:laLower; CaseCode:#$0492), // CYRILLIC SMALL LETTER GHE WITH STROKE
  3230. (Unicode:#$0494; Attr:laUpper; CaseCode:#$0495), // CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
  3231. (Unicode:#$0495; Attr:laLower; CaseCode:#$0494), // CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK
  3232. (Unicode:#$0496; Attr:laUpper; CaseCode:#$0497), // CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
  3233. (Unicode:#$0497; Attr:laLower; CaseCode:#$0496), // CYRILLIC SMALL LETTER ZHE WITH DESCENDER
  3234. (Unicode:#$0498; Attr:laUpper; CaseCode:#$0499), // CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
  3235. (Unicode:#$0499; Attr:laLower; CaseCode:#$0498), // CYRILLIC SMALL LETTER ZE WITH DESCENDER
  3236. (Unicode:#$049A; Attr:laUpper; CaseCode:#$049B), // CYRILLIC CAPITAL LETTER KA WITH DESCENDER
  3237. (Unicode:#$049B; Attr:laLower; CaseCode:#$049A), // CYRILLIC SMALL LETTER KA WITH DESCENDER
  3238. (Unicode:#$049C; Attr:laUpper; CaseCode:#$049D), // CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
  3239. (Unicode:#$049D; Attr:laLower; CaseCode:#$049C), // CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE
  3240. (Unicode:#$049E; Attr:laUpper; CaseCode:#$049F), // CYRILLIC CAPITAL LETTER KA WITH STROKE
  3241. (Unicode:#$049F; Attr:laLower; CaseCode:#$049E), // CYRILLIC SMALL LETTER KA WITH STROKE
  3242. (Unicode:#$04A0; Attr:laUpper; CaseCode:#$04A1), // CYRILLIC CAPITAL LETTER BASHKIR KA
  3243. (Unicode:#$04A1; Attr:laLower; CaseCode:#$04A0), // CYRILLIC SMALL LETTER BASHKIR KA
  3244. (Unicode:#$04A2; Attr:laUpper; CaseCode:#$04A3), // CYRILLIC CAPITAL LETTER EN WITH DESCENDER
  3245. (Unicode:#$04A3; Attr:laLower; CaseCode:#$04A2), // CYRILLIC SMALL LETTER EN WITH DESCENDER
  3246. (Unicode:#$04A4; Attr:laUpper; CaseCode:#$04A5), // CYRILLIC CAPITAL LIGATURE EN GHE
  3247. (Unicode:#$04A5; Attr:laLower; CaseCode:#$04A4), // CYRILLIC SMALL LIGATURE EN GHE
  3248. (Unicode:#$04A6; Attr:laUpper; CaseCode:#$04A7), // CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
  3249. (Unicode:#$04A7; Attr:laLower; CaseCode:#$04A6), // CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK
  3250. (Unicode:#$04A8; Attr:laUpper; CaseCode:#$04A9), // CYRILLIC CAPITAL LETTER ABKHASIAN HA
  3251. (Unicode:#$04A9; Attr:laLower; CaseCode:#$04A8), // CYRILLIC SMALL LETTER ABKHASIAN HA
  3252. (Unicode:#$04AA; Attr:laUpper; CaseCode:#$04AB), // CYRILLIC CAPITAL LETTER ES WITH DESCENDER
  3253. (Unicode:#$04AB; Attr:laLower; CaseCode:#$04AA), // CYRILLIC SMALL LETTER ES WITH DESCENDER
  3254. (Unicode:#$04AC; Attr:laUpper; CaseCode:#$04AD), // CYRILLIC CAPITAL LETTER TE WITH DESCENDER
  3255. (Unicode:#$04AD; Attr:laLower; CaseCode:#$04AC), // CYRILLIC SMALL LETTER TE WITH DESCENDER
  3256. (Unicode:#$04AE; Attr:laUpper; CaseCode:#$04AF), // CYRILLIC CAPITAL LETTER STRAIGHT U
  3257. (Unicode:#$04AF; Attr:laLower; CaseCode:#$04AE), // CYRILLIC SMALL LETTER STRAIGHT U
  3258. (Unicode:#$04B0; Attr:laUpper; CaseCode:#$04B1), // CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
  3259. (Unicode:#$04B1; Attr:laLower; CaseCode:#$04B0), // CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
  3260. (Unicode:#$04B2; Attr:laUpper; CaseCode:#$04B3), // CYRILLIC CAPITAL LETTER HA WITH DESCENDER
  3261. (Unicode:#$04B3; Attr:laLower; CaseCode:#$04B2), // CYRILLIC SMALL LETTER HA WITH DESCENDER
  3262. (Unicode:#$04B4; Attr:laUpper; CaseCode:#$04B5), // CYRILLIC CAPITAL LIGATURE TE TSE
  3263. (Unicode:#$04B5; Attr:laLower; CaseCode:#$04B4), // CYRILLIC SMALL LIGATURE TE TSE
  3264. (Unicode:#$04B6; Attr:laUpper; CaseCode:#$04B7), // CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
  3265. (Unicode:#$04B7; Attr:laLower; CaseCode:#$04B6), // CYRILLIC SMALL LETTER CHE WITH DESCENDER
  3266. (Unicode:#$04B8; Attr:laUpper; CaseCode:#$04B9), // CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
  3267. (Unicode:#$04B9; Attr:laLower; CaseCode:#$04B8), // CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE
  3268. (Unicode:#$04BA; Attr:laUpper; CaseCode:#$04BB), // CYRILLIC CAPITAL LETTER SHHA
  3269. (Unicode:#$04BB; Attr:laLower; CaseCode:#$04BA), // CYRILLIC SMALL LETTER SHHA
  3270. (Unicode:#$04BC; Attr:laUpper; CaseCode:#$04BD), // CYRILLIC CAPITAL LETTER ABKHASIAN CHE
  3271. (Unicode:#$04BD; Attr:laLower; CaseCode:#$04BC), // CYRILLIC SMALL LETTER ABKHASIAN CHE
  3272. (Unicode:#$04BE; Attr:laUpper; CaseCode:#$04BF), // CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
  3273. (Unicode:#$04BF; Attr:laLower; CaseCode:#$04BE), // CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER
  3274. (Unicode:#$04C0; Attr:laUpper; CaseCode:#$FFFF), // CYRILLIC LETTER PALOCHKA
  3275. (Unicode:#$04C1; Attr:laUpper; CaseCode:#$04C2), // CYRILLIC CAPITAL LETTER ZHE WITH BREVE
  3276. (Unicode:#$04C2; Attr:laLower; CaseCode:#$04C1), // CYRILLIC SMALL LETTER ZHE WITH BREVE
  3277. (Unicode:#$04C3; Attr:laUpper; CaseCode:#$04C4), // CYRILLIC CAPITAL LETTER KA WITH HOOK
  3278. (Unicode:#$04C4; Attr:laLower; CaseCode:#$04C3), // CYRILLIC SMALL LETTER KA WITH HOOK
  3279. (Unicode:#$04C7; Attr:laUpper; CaseCode:#$04C8), // CYRILLIC CAPITAL LETTER EN WITH HOOK
  3280. (Unicode:#$04C8; Attr:laLower; CaseCode:#$04C7), // CYRILLIC SMALL LETTER EN WITH HOOK
  3281. (Unicode:#$04CB; Attr:laUpper; CaseCode:#$04CC), // CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
  3282. (Unicode:#$04CC; Attr:laLower; CaseCode:#$04CB), // CYRILLIC SMALL LETTER KHAKASSIAN CHE
  3283. (Unicode:#$04D0; Attr:laUpper; CaseCode:#$04D1), // CYRILLIC CAPITAL LETTER A WITH BREVE
  3284. (Unicode:#$04D1; Attr:laLower; CaseCode:#$04D0), // CYRILLIC SMALL LETTER A WITH BREVE
  3285. (Unicode:#$04D2; Attr:laUpper; CaseCode:#$04D3), // CYRILLIC CAPITAL LETTER A WITH DIAERESIS
  3286. (Unicode:#$04D3; Attr:laLower; CaseCode:#$04D2), // CYRILLIC SMALL LETTER A WITH DIAERESIS
  3287. (Unicode:#$04D4; Attr:laUpper; CaseCode:#$04D5), // CYRILLIC CAPITAL LIGATURE A IE
  3288. (Unicode:#$04D5; Attr:laLower; CaseCode:#$04D4), // CYRILLIC SMALL LIGATURE A IE
  3289. (Unicode:#$04D6; Attr:laUpper; CaseCode:#$04D7), // CYRILLIC CAPITAL LETTER IE WITH BREVE
  3290. (Unicode:#$04D7; Attr:laLower; CaseCode:#$04D6), // CYRILLIC SMALL LETTER IE WITH BREVE
  3291. (Unicode:#$04D8; Attr:laUpper; CaseCode:#$04D9), // CYRILLIC CAPITAL LETTER SCHWA
  3292. (Unicode:#$04D9; Attr:laLower; CaseCode:#$04D8), // CYRILLIC SMALL LETTER SCHWA
  3293. (Unicode:#$04DA; Attr:laUpper; CaseCode:#$04DB), // CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
  3294. (Unicode:#$04DB; Attr:laLower; CaseCode:#$04DA), // CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
  3295. (Unicode:#$04DC; Attr:laUpper; CaseCode:#$04DD), // CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
  3296. (Unicode:#$04DD; Attr:laLower; CaseCode:#$04DC), // CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
  3297. (Unicode:#$04DE; Attr:laUpper; CaseCode:#$04DF), // CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
  3298. (Unicode:#$04DF; Attr:laLower; CaseCode:#$04DE), // CYRILLIC SMALL LETTER ZE WITH DIAERESIS
  3299. (Unicode:#$04E0; Attr:laUpper; CaseCode:#$04E1), // CYRILLIC CAPITAL LETTER ABKHASIAN DZE
  3300. (Unicode:#$04E1; Attr:laLower; CaseCode:#$04E0), // CYRILLIC SMALL LETTER ABKHASIAN DZE
  3301. (Unicode:#$04E2; Attr:laUpper; CaseCode:#$04E3), // CYRILLIC CAPITAL LETTER I WITH MACRON
  3302. (Unicode:#$04E3; Attr:laLower; CaseCode:#$04E2), // CYRILLIC SMALL LETTER I WITH MACRON
  3303. (Unicode:#$04E4; Attr:laUpper; CaseCode:#$04E5), // CYRILLIC CAPITAL LETTER I WITH DIAERESIS
  3304. (Unicode:#$04E5; Attr:laLower; CaseCode:#$04E4), // CYRILLIC SMALL LETTER I WITH DIAERESIS
  3305. (Unicode:#$04E6; Attr:laUpper; CaseCode:#$04E7), // CYRILLIC CAPITAL LETTER O WITH DIAERESIS
  3306. (Unicode:#$04E7; Attr:laLower; CaseCode:#$04E6), // CYRILLIC SMALL LETTER O WITH DIAERESIS
  3307. (Unicode:#$04E8; Attr:laUpper; CaseCode:#$04E9), // CYRILLIC CAPITAL LETTER BARRED O
  3308. (Unicode:#$04E9; Attr:laLower; CaseCode:#$04E8), // CYRILLIC SMALL LETTER BARRED O
  3309. (Unicode:#$04EA; Attr:laUpper; CaseCode:#$04EB), // CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
  3310. (Unicode:#$04EB; Attr:laLower; CaseCode:#$04EA), // CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
  3311. (Unicode:#$04EC; Attr:laUpper; CaseCode:#$04ED), // CYRILLIC CAPITAL LETTER E WITH DIAERESIS
  3312. (Unicode:#$04ED; Attr:laLower; CaseCode:#$04EC), // CYRILLIC SMALL LETTER E WITH DIAERESIS
  3313. (Unicode:#$04EE; Attr:laUpper; CaseCode:#$04EF), // CYRILLIC CAPITAL LETTER U WITH MACRON
  3314. (Unicode:#$04EF; Attr:laLower; CaseCode:#$04EE), // CYRILLIC SMALL LETTER U WITH MACRON
  3315. (Unicode:#$04F0; Attr:laUpper; CaseCode:#$04F1), // CYRILLIC CAPITAL LETTER U WITH DIAERESIS
  3316. (Unicode:#$04F1; Attr:laLower; CaseCode:#$04F0), // CYRILLIC SMALL LETTER U WITH DIAERESIS
  3317. (Unicode:#$04F2; Attr:laUpper; CaseCode:#$04F3), // CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
  3318. (Unicode:#$04F3; Attr:laLower; CaseCode:#$04F2), // CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
  3319. (Unicode:#$04F4; Attr:laUpper; CaseCode:#$04F5), // CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
  3320. (Unicode:#$04F5; Attr:laLower; CaseCode:#$04F4), // CYRILLIC SMALL LETTER CHE WITH DIAERESIS
  3321. (Unicode:#$04F8; Attr:laUpper; CaseCode:#$04F9), // CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
  3322. (Unicode:#$04F9; Attr:laLower; CaseCode:#$04F8), // CYRILLIC SMALL LETTER YERU WITH DIAERESIS
  3323. (Unicode:#$0531; Attr:laUpper; CaseCode:#$0561), // ARMENIAN CAPITAL LETTER AYB
  3324. (Unicode:#$0532; Attr:laUpper; CaseCode:#$0562), // ARMENIAN CAPITAL LETTER BEN
  3325. (Unicode:#$0533; Attr:laUpper; CaseCode:#$0563), // ARMENIAN CAPITAL LETTER GIM
  3326. (Unicode:#$0534; Attr:laUpper; CaseCode:#$0564), // ARMENIAN CAPITAL LETTER DA
  3327. (Unicode:#$0535; Attr:laUpper; CaseCode:#$0565), // ARMENIAN CAPITAL LETTER ECH
  3328. (Unicode:#$0536; Attr:laUpper; CaseCode:#$0566), // ARMENIAN CAPITAL LETTER ZA
  3329. (Unicode:#$0537; Attr:laUpper; CaseCode:#$0567), // ARMENIAN CAPITAL LETTER EH
  3330. (Unicode:#$0538; Attr:laUpper; CaseCode:#$0568), // ARMENIAN CAPITAL LETTER ET
  3331. (Unicode:#$0539; Attr:laUpper; CaseCode:#$0569), // ARMENIAN CAPITAL LETTER TO
  3332. (Unicode:#$053A; Attr:laUpper; CaseCode:#$056A), // ARMENIAN CAPITAL LETTER ZHE
  3333. (Unicode:#$053B; Attr:laUpper; CaseCode:#$056B), // ARMENIAN CAPITAL LETTER INI
  3334. (Unicode:#$053C; Attr:laUpper; CaseCode:#$056C), // ARMENIAN CAPITAL LETTER LIWN
  3335. (Unicode:#$053D; Attr:laUpper; CaseCode:#$056D), // ARMENIAN CAPITAL LETTER XEH
  3336. (Unicode:#$053E; Attr:laUpper; CaseCode:#$056E), // ARMENIAN CAPITAL LETTER CA
  3337. (Unicode:#$053F; Attr:laUpper; CaseCode:#$056F), // ARMENIAN CAPITAL LETTER KEN
  3338. (Unicode:#$0540; Attr:laUpper; CaseCode:#$0570), // ARMENIAN CAPITAL LETTER HO
  3339. (Unicode:#$0541; Attr:laUpper; CaseCode:#$0571), // ARMENIAN CAPITAL LETTER JA
  3340. (Unicode:#$0542; Attr:laUpper; CaseCode:#$0572), // ARMENIAN CAPITAL LETTER GHAD
  3341. (Unicode:#$0543; Attr:laUpper; CaseCode:#$0573), // ARMENIAN CAPITAL LETTER CHEH
  3342. (Unicode:#$0544; Attr:laUpper; CaseCode:#$0574), // ARMENIAN CAPITAL LETTER MEN
  3343. (Unicode:#$0545; Attr:laUpper; CaseCode:#$0575), // ARMENIAN CAPITAL LETTER YI
  3344. (Unicode:#$0546; Attr:laUpper; CaseCode:#$0576), // ARMENIAN CAPITAL LETTER NOW
  3345. (Unicode:#$0547; Attr:laUpper; CaseCode:#$0577), // ARMENIAN CAPITAL LETTER SHA
  3346. (Unicode:#$0548; Attr:laUpper; CaseCode:#$0578), // ARMENIAN CAPITAL LETTER VO
  3347. (Unicode:#$0549; Attr:laUpper; CaseCode:#$0579), // ARMENIAN CAPITAL LETTER CHA
  3348. (Unicode:#$054A; Attr:laUpper; CaseCode:#$057A), // ARMENIAN CAPITAL LETTER PEH
  3349. (Unicode:#$054B; Attr:laUpper; CaseCode:#$057B), // ARMENIAN CAPITAL LETTER JHEH
  3350. (Unicode:#$054C; Attr:laUpper; CaseCode:#$057C), // ARMENIAN CAPITAL LETTER RA
  3351. (Unicode:#$054D; Attr:laUpper; CaseCode:#$057D), // ARMENIAN CAPITAL LETTER SEH
  3352. (Unicode:#$054E; Attr:laUpper; CaseCode:#$057E), // ARMENIAN CAPITAL LETTER VEW
  3353. (Unicode:#$054F; Attr:laUpper; CaseCode:#$057F), // ARMENIAN CAPITAL LETTER TIWN
  3354. (Unicode:#$0550; Attr:laUpper; CaseCode:#$0580), // ARMENIAN CAPITAL LETTER REH
  3355. (Unicode:#$0551; Attr:laUpper; CaseCode:#$0581), // ARMENIAN CAPITAL LETTER CO
  3356. (Unicode:#$0552; Attr:laUpper; CaseCode:#$0582), // ARMENIAN CAPITAL LETTER YIWN
  3357. (Unicode:#$0553; Attr:laUpper; CaseCode:#$0583), // ARMENIAN CAPITAL LETTER PIWR
  3358. (Unicode:#$0554; Attr:laUpper; CaseCode:#$0584), // ARMENIAN CAPITAL LETTER KEH
  3359. (Unicode:#$0555; Attr:laUpper; CaseCode:#$0585), // ARMENIAN CAPITAL LETTER OH
  3360. (Unicode:#$0556; Attr:laUpper; CaseCode:#$0586), // ARMENIAN CAPITAL LETTER FEH
  3361. (Unicode:#$0561; Attr:laLower; CaseCode:#$0531), // ARMENIAN SMALL LETTER AYB
  3362. (Unicode:#$0562; Attr:laLower; CaseCode:#$0532), // ARMENIAN SMALL LETTER BEN
  3363. (Unicode:#$0563; Attr:laLower; CaseCode:#$0533), // ARMENIAN SMALL LETTER GIM
  3364. (Unicode:#$0564; Attr:laLower; CaseCode:#$0534), // ARMENIAN SMALL LETTER DA
  3365. (Unicode:#$0565; Attr:laLower; CaseCode:#$0535), // ARMENIAN SMALL LETTER ECH
  3366. (Unicode:#$0566; Attr:laLower; CaseCode:#$0536), // ARMENIAN SMALL LETTER ZA
  3367. (Unicode:#$0567; Attr:laLower; CaseCode:#$0537), // ARMENIAN SMALL LETTER EH
  3368. (Unicode:#$0568; Attr:laLower; CaseCode:#$0538), // ARMENIAN SMALL LETTER ET
  3369. (Unicode:#$0569; Attr:laLower; CaseCode:#$0539), // ARMENIAN SMALL LETTER TO
  3370. (Unicode:#$056A; Attr:laLower; CaseCode:#$053A), // ARMENIAN SMALL LETTER ZHE
  3371. (Unicode:#$056B; Attr:laLower; CaseCode:#$053B), // ARMENIAN SMALL LETTER INI
  3372. (Unicode:#$056C; Attr:laLower; CaseCode:#$053C), // ARMENIAN SMALL LETTER LIWN
  3373. (Unicode:#$056D; Attr:laLower; CaseCode:#$053D), // ARMENIAN SMALL LETTER XEH
  3374. (Unicode:#$056E; Attr:laLower; CaseCode:#$053E), // ARMENIAN SMALL LETTER CA
  3375. (Unicode:#$056F; Attr:laLower; CaseCode:#$053F), // ARMENIAN SMALL LETTER KEN
  3376. (Unicode:#$0570; Attr:laLower; CaseCode:#$0540), // ARMENIAN SMALL LETTER HO
  3377. (Unicode:#$0571; Attr:laLower; CaseCode:#$0541), // ARMENIAN SMALL LETTER JA
  3378. (Unicode:#$0572; Attr:laLower; CaseCode:#$0542), // ARMENIAN SMALL LETTER GHAD
  3379. (Unicode:#$0573; Attr:laLower; CaseCode:#$0543), // ARMENIAN SMALL LETTER CHEH
  3380. (Unicode:#$0574; Attr:laLower; CaseCode:#$0544), // ARMENIAN SMALL LETTER MEN
  3381. (Unicode:#$0575; Attr:laLower; CaseCode:#$0545), // ARMENIAN SMALL LETTER YI
  3382. (Unicode:#$0576; Attr:laLower; CaseCode:#$0546), // ARMENIAN SMALL LETTER NOW
  3383. (Unicode:#$0577; Attr:laLower; CaseCode:#$0547), // ARMENIAN SMALL LETTER SHA
  3384. (Unicode:#$0578; Attr:laLower; CaseCode:#$0548), // ARMENIAN SMALL LETTER VO
  3385. (Unicode:#$0579; Attr:laLower; CaseCode:#$0549), // ARMENIAN SMALL LETTER CHA
  3386. (Unicode:#$057A; Attr:laLower; CaseCode:#$054A), // ARMENIAN SMALL LETTER PEH
  3387. (Unicode:#$057B; Attr:laLower; CaseCode:#$054B), // ARMENIAN SMALL LETTER JHEH
  3388. (Unicode:#$057C; Attr:laLower; CaseCode:#$054C), // ARMENIAN SMALL LETTER RA
  3389. (Unicode:#$057D; Attr:laLower; CaseCode:#$054D), // ARMENIAN SMALL LETTER SEH
  3390. (Unicode:#$057E; Attr:laLower; CaseCode:#$054E), // ARMENIAN SMALL LETTER VEW
  3391. (Unicode:#$057F; Attr:laLower; CaseCode:#$054F), // ARMENIAN SMALL LETTER TIWN
  3392. (Unicode:#$0580; Attr:laLower; CaseCode:#$0550), // ARMENIAN SMALL LETTER REH
  3393. (Unicode:#$0581; Attr:laLower; CaseCode:#$0551), // ARMENIAN SMALL LETTER CO
  3394. (Unicode:#$0582; Attr:laLower; CaseCode:#$0552), // ARMENIAN SMALL LETTER YIWN
  3395. (Unicode:#$0583; Attr:laLower; CaseCode:#$0553), // ARMENIAN SMALL LETTER PIWR
  3396. (Unicode:#$0584; Attr:laLower; CaseCode:#$0554), // ARMENIAN SMALL LETTER KEH
  3397. (Unicode:#$0585; Attr:laLower; CaseCode:#$0555), // ARMENIAN SMALL LETTER OH
  3398. (Unicode:#$0586; Attr:laLower; CaseCode:#$0556), // ARMENIAN SMALL LETTER FEH
  3399. (Unicode:#$0587; Attr:laLower; CaseCode:#$FFFF), // ARMENIAN SMALL LIGATURE ECH YIWN
  3400. (Unicode:#$10A0; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER AN
  3401. (Unicode:#$10A1; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER BAN
  3402. (Unicode:#$10A2; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER GAN
  3403. (Unicode:#$10A3; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER DON
  3404. (Unicode:#$10A4; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER EN
  3405. (Unicode:#$10A5; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER VIN
  3406. (Unicode:#$10A6; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER ZEN
  3407. (Unicode:#$10A7; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER TAN
  3408. (Unicode:#$10A8; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER IN
  3409. (Unicode:#$10A9; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER KAN
  3410. (Unicode:#$10AA; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER LAS
  3411. (Unicode:#$10AB; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER MAN
  3412. (Unicode:#$10AC; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER NAR
  3413. (Unicode:#$10AD; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER ON
  3414. (Unicode:#$10AE; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER PAR
  3415. (Unicode:#$10AF; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER ZHAR
  3416. (Unicode:#$10B0; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER RAE
  3417. (Unicode:#$10B1; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER SAN
  3418. (Unicode:#$10B2; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER TAR
  3419. (Unicode:#$10B3; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER UN
  3420. (Unicode:#$10B4; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER PHAR
  3421. (Unicode:#$10B5; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER KHAR
  3422. (Unicode:#$10B6; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER GHAN
  3423. (Unicode:#$10B7; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER QAR
  3424. (Unicode:#$10B8; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER SHIN
  3425. (Unicode:#$10B9; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER CHIN
  3426. (Unicode:#$10BA; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER CAN
  3427. (Unicode:#$10BB; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER JIL
  3428. (Unicode:#$10BC; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER CIL
  3429. (Unicode:#$10BD; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER CHAR
  3430. (Unicode:#$10BE; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER XAN
  3431. (Unicode:#$10BF; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER JHAN
  3432. (Unicode:#$10C0; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER HAE
  3433. (Unicode:#$10C1; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER HE
  3434. (Unicode:#$10C2; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER HIE
  3435. (Unicode:#$10C3; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER WE
  3436. (Unicode:#$10C4; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER HAR
  3437. (Unicode:#$10C5; Attr:laUpper; CaseCode:#$FFFF), // GEORGIAN CAPITAL LETTER HOE
  3438. (Unicode:#$1E00; Attr:laUpper; CaseCode:#$1E01), // LATIN CAPITAL LETTER A WITH RING BELOW
  3439. (Unicode:#$1E01; Attr:laLower; CaseCode:#$1E00), // LATIN SMALL LETTER A WITH RING BELOW
  3440. (Unicode:#$1E02; Attr:laUpper; CaseCode:#$1E03), // LATIN CAPITAL LETTER B WITH DOT ABOVE
  3441. (Unicode:#$1E03; Attr:laLower; CaseCode:#$1E02), // LATIN SMALL LETTER B WITH DOT ABOVE
  3442. (Unicode:#$1E04; Attr:laUpper; CaseCode:#$1E05), // LATIN CAPITAL LETTER B WITH DOT BELOW
  3443. (Unicode:#$1E05; Attr:laLower; CaseCode:#$1E04), // LATIN SMALL LETTER B WITH DOT BELOW
  3444. (Unicode:#$1E06; Attr:laUpper; CaseCode:#$1E07), // LATIN CAPITAL LETTER B WITH LINE BELOW
  3445. (Unicode:#$1E07; Attr:laLower; CaseCode:#$1E06), // LATIN SMALL LETTER B WITH LINE BELOW
  3446. (Unicode:#$1E08; Attr:laUpper; CaseCode:#$1E09), // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
  3447. (Unicode:#$1E09; Attr:laLower; CaseCode:#$1E08), // LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
  3448. (Unicode:#$1E0A; Attr:laUpper; CaseCode:#$1E0B), // LATIN CAPITAL LETTER D WITH DOT ABOVE
  3449. (Unicode:#$1E0B; Attr:laLower; CaseCode:#$1E0A), // LATIN SMALL LETTER D WITH DOT ABOVE
  3450. (Unicode:#$1E0C; Attr:laUpper; CaseCode:#$1E0D), // LATIN CAPITAL LETTER D WITH DOT BELOW
  3451. (Unicode:#$1E0D; Attr:laLower; CaseCode:#$1E0C), // LATIN SMALL LETTER D WITH DOT BELOW
  3452. (Unicode:#$1E0E; Attr:laUpper; CaseCode:#$1E0F), // LATIN CAPITAL LETTER D WITH LINE BELOW
  3453. (Unicode:#$1E0F; Attr:laLower; CaseCode:#$1E0E), // LATIN SMALL LETTER D WITH LINE BELOW
  3454. (Unicode:#$1E10; Attr:laUpper; CaseCode:#$1E11), // LATIN CAPITAL LETTER D WITH CEDILLA
  3455. (Unicode:#$1E11; Attr:laLower; CaseCode:#$1E10), // LATIN SMALL LETTER D WITH CEDILLA
  3456. (Unicode:#$1E12; Attr:laUpper; CaseCode:#$1E13), // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
  3457. (Unicode:#$1E13; Attr:laLower; CaseCode:#$1E12), // LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
  3458. (Unicode:#$1E14; Attr:laUpper; CaseCode:#$1E15), // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
  3459. (Unicode:#$1E15; Attr:laLower; CaseCode:#$1E14), // LATIN SMALL LETTER E WITH MACRON AND GRAVE
  3460. (Unicode:#$1E16; Attr:laUpper; CaseCode:#$1E17), // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
  3461. (Unicode:#$1E17; Attr:laLower; CaseCode:#$1E16), // LATIN SMALL LETTER E WITH MACRON AND ACUTE
  3462. (Unicode:#$1E18; Attr:laUpper; CaseCode:#$1E19), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
  3463. (Unicode:#$1E19; Attr:laLower; CaseCode:#$1E18), // LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
  3464. (Unicode:#$1E1A; Attr:laUpper; CaseCode:#$1E1B), // LATIN CAPITAL LETTER E WITH TILDE BELOW
  3465. (Unicode:#$1E1B; Attr:laLower; CaseCode:#$1E1A), // LATIN SMALL LETTER E WITH TILDE BELOW
  3466. (Unicode:#$1E1C; Attr:laUpper; CaseCode:#$1E1D), // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
  3467. (Unicode:#$1E1D; Attr:laLower; CaseCode:#$1E1C), // LATIN SMALL LETTER E WITH CEDILLA AND BREVE
  3468. (Unicode:#$1E1E; Attr:laUpper; CaseCode:#$1E1F), // LATIN CAPITAL LETTER F WITH DOT ABOVE
  3469. (Unicode:#$1E1F; Attr:laLower; CaseCode:#$1E1E), // LATIN SMALL LETTER F WITH DOT ABOVE
  3470. (Unicode:#$1E20; Attr:laUpper; CaseCode:#$1E21), // LATIN CAPITAL LETTER G WITH MACRON
  3471. (Unicode:#$1E21; Attr:laLower; CaseCode:#$1E20), // LATIN SMALL LETTER G WITH MACRON
  3472. (Unicode:#$1E22; Attr:laUpper; CaseCode:#$1E23), // LATIN CAPITAL LETTER H WITH DOT ABOVE
  3473. (Unicode:#$1E23; Attr:laLower; CaseCode:#$1E22), // LATIN SMALL LETTER H WITH DOT ABOVE
  3474. (Unicode:#$1E24; Attr:laUpper; CaseCode:#$1E25), // LATIN CAPITAL LETTER H WITH DOT BELOW
  3475. (Unicode:#$1E25; Attr:laLower; CaseCode:#$1E24), // LATIN SMALL LETTER H WITH DOT BELOW
  3476. (Unicode:#$1E26; Attr:laUpper; CaseCode:#$1E27), // LATIN CAPITAL LETTER H WITH DIAERESIS
  3477. (Unicode:#$1E27; Attr:laLower; CaseCode:#$1E26), // LATIN SMALL LETTER H WITH DIAERESIS
  3478. (Unicode:#$1E28; Attr:laUpper; CaseCode:#$1E29), // LATIN CAPITAL LETTER H WITH CEDILLA
  3479. (Unicode:#$1E29; Attr:laLower; CaseCode:#$1E28), // LATIN SMALL LETTER H WITH CEDILLA
  3480. (Unicode:#$1E2A; Attr:laUpper; CaseCode:#$1E2B), // LATIN CAPITAL LETTER H WITH BREVE BELOW
  3481. (Unicode:#$1E2B; Attr:laLower; CaseCode:#$1E2A), // LATIN SMALL LETTER H WITH BREVE BELOW
  3482. (Unicode:#$1E2C; Attr:laUpper; CaseCode:#$1E2D), // LATIN CAPITAL LETTER I WITH TILDE BELOW
  3483. (Unicode:#$1E2D; Attr:laLower; CaseCode:#$1E2C), // LATIN SMALL LETTER I WITH TILDE BELOW
  3484. (Unicode:#$1E2E; Attr:laUpper; CaseCode:#$1E2F), // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
  3485. (Unicode:#$1E2F; Attr:laLower; CaseCode:#$1E2E), // LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
  3486. (Unicode:#$1E30; Attr:laUpper; CaseCode:#$1E31), // LATIN CAPITAL LETTER K WITH ACUTE
  3487. (Unicode:#$1E31; Attr:laLower; CaseCode:#$1E30), // LATIN SMALL LETTER K WITH ACUTE
  3488. (Unicode:#$1E32; Attr:laUpper; CaseCode:#$1E33), // LATIN CAPITAL LETTER K WITH DOT BELOW
  3489. (Unicode:#$1E33; Attr:laLower; CaseCode:#$1E32), // LATIN SMALL LETTER K WITH DOT BELOW
  3490. (Unicode:#$1E34; Attr:laUpper; CaseCode:#$1E35), // LATIN CAPITAL LETTER K WITH LINE BELOW
  3491. (Unicode:#$1E35; Attr:laLower; CaseCode:#$1E34), // LATIN SMALL LETTER K WITH LINE BELOW
  3492. (Unicode:#$1E36; Attr:laUpper; CaseCode:#$1E37), // LATIN CAPITAL LETTER L WITH DOT BELOW
  3493. (Unicode:#$1E37; Attr:laLower; CaseCode:#$1E36), // LATIN SMALL LETTER L WITH DOT BELOW
  3494. (Unicode:#$1E38; Attr:laUpper; CaseCode:#$1E39), // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
  3495. (Unicode:#$1E39; Attr:laLower; CaseCode:#$1E38), // LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
  3496. (Unicode:#$1E3A; Attr:laUpper; CaseCode:#$1E3B), // LATIN CAPITAL LETTER L WITH LINE BELOW
  3497. (Unicode:#$1E3B; Attr:laLower; CaseCode:#$1E3A), // LATIN SMALL LETTER L WITH LINE BELOW
  3498. (Unicode:#$1E3C; Attr:laUpper; CaseCode:#$1E3D), // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
  3499. (Unicode:#$1E3D; Attr:laLower; CaseCode:#$1E3C), // LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
  3500. (Unicode:#$1E3E; Attr:laUpper; CaseCode:#$1E3F), // LATIN CAPITAL LETTER M WITH ACUTE
  3501. (Unicode:#$1E3F; Attr:laLower; CaseCode:#$1E3E), // LATIN SMALL LETTER M WITH ACUTE
  3502. (Unicode:#$1E40; Attr:laUpper; CaseCode:#$1E41), // LATIN CAPITAL LETTER M WITH DOT ABOVE
  3503. (Unicode:#$1E41; Attr:laLower; CaseCode:#$1E40), // LATIN SMALL LETTER M WITH DOT ABOVE
  3504. (Unicode:#$1E42; Attr:laUpper; CaseCode:#$1E43), // LATIN CAPITAL LETTER M WITH DOT BELOW
  3505. (Unicode:#$1E43; Attr:laLower; CaseCode:#$1E42), // LATIN SMALL LETTER M WITH DOT BELOW
  3506. (Unicode:#$1E44; Attr:laUpper; CaseCode:#$1E45), // LATIN CAPITAL LETTER N WITH DOT ABOVE
  3507. (Unicode:#$1E45; Attr:laLower; CaseCode:#$1E44), // LATIN SMALL LETTER N WITH DOT ABOVE
  3508. (Unicode:#$1E46; Attr:laUpper; CaseCode:#$1E47), // LATIN CAPITAL LETTER N WITH DOT BELOW
  3509. (Unicode:#$1E47; Attr:laLower; CaseCode:#$1E46), // LATIN SMALL LETTER N WITH DOT BELOW
  3510. (Unicode:#$1E48; Attr:laUpper; CaseCode:#$1E49), // LATIN CAPITAL LETTER N WITH LINE BELOW
  3511. (Unicode:#$1E49; Attr:laLower; CaseCode:#$1E48), // LATIN SMALL LETTER N WITH LINE BELOW
  3512. (Unicode:#$1E4A; Attr:laUpper; CaseCode:#$1E4B), // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
  3513. (Unicode:#$1E4B; Attr:laLower; CaseCode:#$1E4A), // LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
  3514. (Unicode:#$1E4C; Attr:laUpper; CaseCode:#$1E4D), // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
  3515. (Unicode:#$1E4D; Attr:laLower; CaseCode:#$1E4C), // LATIN SMALL LETTER O WITH TILDE AND ACUTE
  3516. (Unicode:#$1E4E; Attr:laUpper; CaseCode:#$1E4F), // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
  3517. (Unicode:#$1E4F; Attr:laLower; CaseCode:#$1E4E), // LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
  3518. (Unicode:#$1E50; Attr:laUpper; CaseCode:#$1E51), // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
  3519. (Unicode:#$1E51; Attr:laLower; CaseCode:#$1E50), // LATIN SMALL LETTER O WITH MACRON AND GRAVE
  3520. (Unicode:#$1E52; Attr:laUpper; CaseCode:#$1E53), // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
  3521. (Unicode:#$1E53; Attr:laLower; CaseCode:#$1E52), // LATIN SMALL LETTER O WITH MACRON AND ACUTE
  3522. (Unicode:#$1E54; Attr:laUpper; CaseCode:#$1E55), // LATIN CAPITAL LETTER P WITH ACUTE
  3523. (Unicode:#$1E55; Attr:laLower; CaseCode:#$1E54), // LATIN SMALL LETTER P WITH ACUTE
  3524. (Unicode:#$1E56; Attr:laUpper; CaseCode:#$1E57), // LATIN CAPITAL LETTER P WITH DOT ABOVE
  3525. (Unicode:#$1E57; Attr:laLower; CaseCode:#$1E56), // LATIN SMALL LETTER P WITH DOT ABOVE
  3526. (Unicode:#$1E58; Attr:laUpper; CaseCode:#$1E59), // LATIN CAPITAL LETTER R WITH DOT ABOVE
  3527. (Unicode:#$1E59; Attr:laLower; CaseCode:#$1E58), // LATIN SMALL LETTER R WITH DOT ABOVE
  3528. (Unicode:#$1E5A; Attr:laUpper; CaseCode:#$1E5B), // LATIN CAPITAL LETTER R WITH DOT BELOW
  3529. (Unicode:#$1E5B; Attr:laLower; CaseCode:#$1E5A), // LATIN SMALL LETTER R WITH DOT BELOW
  3530. (Unicode:#$1E5C; Attr:laUpper; CaseCode:#$1E5D), // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
  3531. (Unicode:#$1E5D; Attr:laLower; CaseCode:#$1E5C), // LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
  3532. (Unicode:#$1E5E; Attr:laUpper; CaseCode:#$1E5F), // LATIN CAPITAL LETTER R WITH LINE BELOW
  3533. (Unicode:#$1E5F; Attr:laLower; CaseCode:#$1E5E), // LATIN SMALL LETTER R WITH LINE BELOW
  3534. (Unicode:#$1E60; Attr:laUpper; CaseCode:#$1E61), // LATIN CAPITAL LETTER S WITH DOT ABOVE
  3535. (Unicode:#$1E61; Attr:laLower; CaseCode:#$1E60), // LATIN SMALL LETTER S WITH DOT ABOVE
  3536. (Unicode:#$1E62; Attr:laUpper; CaseCode:#$1E63), // LATIN CAPITAL LETTER S WITH DOT BELOW
  3537. (Unicode:#$1E63; Attr:laLower; CaseCode:#$1E62), // LATIN SMALL LETTER S WITH DOT BELOW
  3538. (Unicode:#$1E64; Attr:laUpper; CaseCode:#$1E65), // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
  3539. (Unicode:#$1E65; Attr:laLower; CaseCode:#$1E64), // LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
  3540. (Unicode:#$1E66; Attr:laUpper; CaseCode:#$1E67), // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
  3541. (Unicode:#$1E67; Attr:laLower; CaseCode:#$1E66), // LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
  3542. (Unicode:#$1E68; Attr:laUpper; CaseCode:#$1E69), // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
  3543. (Unicode:#$1E69; Attr:laLower; CaseCode:#$1E68), // LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
  3544. (Unicode:#$1E6A; Attr:laUpper; CaseCode:#$1E6B), // LATIN CAPITAL LETTER T WITH DOT ABOVE
  3545. (Unicode:#$1E6B; Attr:laLower; CaseCode:#$1E6A), // LATIN SMALL LETTER T WITH DOT ABOVE
  3546. (Unicode:#$1E6C; Attr:laUpper; CaseCode:#$1E6D), // LATIN CAPITAL LETTER T WITH DOT BELOW
  3547. (Unicode:#$1E6D; Attr:laLower; CaseCode:#$1E6C), // LATIN SMALL LETTER T WITH DOT BELOW
  3548. (Unicode:#$1E6E; Attr:laUpper; CaseCode:#$1E6F), // LATIN CAPITAL LETTER T WITH LINE BELOW
  3549. (Unicode:#$1E6F; Attr:laLower; CaseCode:#$1E6E), // LATIN SMALL LETTER T WITH LINE BELOW
  3550. (Unicode:#$1E70; Attr:laUpper; CaseCode:#$1E71), // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
  3551. (Unicode:#$1E71; Attr:laLower; CaseCode:#$1E70), // LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
  3552. (Unicode:#$1E72; Attr:laUpper; CaseCode:#$1E73), // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
  3553. (Unicode:#$1E73; Attr:laLower; CaseCode:#$1E72), // LATIN SMALL LETTER U WITH DIAERESIS BELOW
  3554. (Unicode:#$1E74; Attr:laUpper; CaseCode:#$1E75), // LATIN CAPITAL LETTER U WITH TILDE BELOW
  3555. (Unicode:#$1E75; Attr:laLower; CaseCode:#$1E74), // LATIN SMALL LETTER U WITH TILDE BELOW
  3556. (Unicode:#$1E76; Attr:laUpper; CaseCode:#$1E77), // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
  3557. (Unicode:#$1E77; Attr:laLower; CaseCode:#$1E76), // LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
  3558. (Unicode:#$1E78; Attr:laUpper; CaseCode:#$1E79), // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
  3559. (Unicode:#$1E79; Attr:laLower; CaseCode:#$1E78), // LATIN SMALL LETTER U WITH TILDE AND ACUTE
  3560. (Unicode:#$1E7A; Attr:laUpper; CaseCode:#$1E7B), // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
  3561. (Unicode:#$1E7B; Attr:laLower; CaseCode:#$1E7A), // LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
  3562. (Unicode:#$1E7C; Attr:laUpper; CaseCode:#$1E7D), // LATIN CAPITAL LETTER V WITH TILDE
  3563. (Unicode:#$1E7D; Attr:laLower; CaseCode:#$1E7C), // LATIN SMALL LETTER V WITH TILDE
  3564. (Unicode:#$1E7E; Attr:laUpper; CaseCode:#$1E7F), // LATIN CAPITAL LETTER V WITH DOT BELOW
  3565. (Unicode:#$1E7F; Attr:laLower; CaseCode:#$1E7E), // LATIN SMALL LETTER V WITH DOT BELOW
  3566. (Unicode:#$1E80; Attr:laUpper; CaseCode:#$1E81), // LATIN CAPITAL LETTER W WITH GRAVE
  3567. (Unicode:#$1E81; Attr:laLower; CaseCode:#$1E80), // LATIN SMALL LETTER W WITH GRAVE
  3568. (Unicode:#$1E82; Attr:laUpper; CaseCode:#$1E83), // LATIN CAPITAL LETTER W WITH ACUTE
  3569. (Unicode:#$1E83; Attr:laLower; CaseCode:#$1E82), // LATIN SMALL LETTER W WITH ACUTE
  3570. (Unicode:#$1E84; Attr:laUpper; CaseCode:#$1E85), // LATIN CAPITAL LETTER W WITH DIAERESIS
  3571. (Unicode:#$1E85; Attr:laLower; CaseCode:#$1E84), // LATIN SMALL LETTER W WITH DIAERESIS
  3572. (Unicode:#$1E86; Attr:laUpper; CaseCode:#$1E87), // LATIN CAPITAL LETTER W WITH DOT ABOVE
  3573. (Unicode:#$1E87; Attr:laLower; CaseCode:#$1E86), // LATIN SMALL LETTER W WITH DOT ABOVE
  3574. (Unicode:#$1E88; Attr:laUpper; CaseCode:#$1E89), // LATIN CAPITAL LETTER W WITH DOT BELOW
  3575. (Unicode:#$1E89; Attr:laLower; CaseCode:#$1E88), // LATIN SMALL LETTER W WITH DOT BELOW
  3576. (Unicode:#$1E8A; Attr:laUpper; CaseCode:#$1E8B), // LATIN CAPITAL LETTER X WITH DOT ABOVE
  3577. (Unicode:#$1E8B; Attr:laLower; CaseCode:#$1E8A), // LATIN SMALL LETTER X WITH DOT ABOVE
  3578. (Unicode:#$1E8C; Attr:laUpper; CaseCode:#$1E8D), // LATIN CAPITAL LETTER X WITH DIAERESIS
  3579. (Unicode:#$1E8D; Attr:laLower; CaseCode:#$1E8C), // LATIN SMALL LETTER X WITH DIAERESIS
  3580. (Unicode:#$1E8E; Attr:laUpper; CaseCode:#$1E8F), // LATIN CAPITAL LETTER Y WITH DOT ABOVE
  3581. (Unicode:#$1E8F; Attr:laLower; CaseCode:#$1E8E), // LATIN SMALL LETTER Y WITH DOT ABOVE
  3582. (Unicode:#$1E90; Attr:laUpper; CaseCode:#$1E91), // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
  3583. (Unicode:#$1E91; Attr:laLower; CaseCode:#$1E90), // LATIN SMALL LETTER Z WITH CIRCUMFLEX
  3584. (Unicode:#$1E92; Attr:laUpper; CaseCode:#$1E93), // LATIN CAPITAL LETTER Z WITH DOT BELOW
  3585. (Unicode:#$1E93; Attr:laLower; CaseCode:#$1E92), // LATIN SMALL LETTER Z WITH DOT BELOW
  3586. (Unicode:#$1E94; Attr:laUpper; CaseCode:#$1E95), // LATIN CAPITAL LETTER Z WITH LINE BELOW
  3587. (Unicode:#$1E95; Attr:laLower; CaseCode:#$1E94), // LATIN SMALL LETTER Z WITH LINE BELOW
  3588. (Unicode:#$1E96; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER H WITH LINE BELOW
  3589. (Unicode:#$1E97; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER T WITH DIAERESIS
  3590. (Unicode:#$1E98; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER W WITH RING ABOVE
  3591. (Unicode:#$1E99; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER Y WITH RING ABOVE
  3592. (Unicode:#$1E9A; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LETTER A WITH RIGHT HALF RING
  3593. (Unicode:#$1E9B; Attr:laLower; CaseCode:#$1E60), // LATIN SMALL LETTER LONG S WITH DOT ABOVE
  3594. (Unicode:#$1EA0; Attr:laUpper; CaseCode:#$1EA1), // LATIN CAPITAL LETTER A WITH DOT BELOW
  3595. (Unicode:#$1EA1; Attr:laLower; CaseCode:#$1EA0), // LATIN SMALL LETTER A WITH DOT BELOW
  3596. (Unicode:#$1EA2; Attr:laUpper; CaseCode:#$1EA3), // LATIN CAPITAL LETTER A WITH HOOK ABOVE
  3597. (Unicode:#$1EA3; Attr:laLower; CaseCode:#$1EA2), // LATIN SMALL LETTER A WITH HOOK ABOVE
  3598. (Unicode:#$1EA4; Attr:laUpper; CaseCode:#$1EA5), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
  3599. (Unicode:#$1EA5; Attr:laLower; CaseCode:#$1EA4), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
  3600. (Unicode:#$1EA6; Attr:laUpper; CaseCode:#$1EA7), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
  3601. (Unicode:#$1EA7; Attr:laLower; CaseCode:#$1EA6), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
  3602. (Unicode:#$1EA8; Attr:laUpper; CaseCode:#$1EA9), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
  3603. (Unicode:#$1EA9; Attr:laLower; CaseCode:#$1EA8), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
  3604. (Unicode:#$1EAA; Attr:laUpper; CaseCode:#$1EAB), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
  3605. (Unicode:#$1EAB; Attr:laLower; CaseCode:#$1EAA), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
  3606. (Unicode:#$1EAC; Attr:laUpper; CaseCode:#$1EAD), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
  3607. (Unicode:#$1EAD; Attr:laLower; CaseCode:#$1EAC), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
  3608. (Unicode:#$1EAE; Attr:laUpper; CaseCode:#$1EAF), // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
  3609. (Unicode:#$1EAF; Attr:laLower; CaseCode:#$1EAE), // LATIN SMALL LETTER A WITH BREVE AND ACUTE
  3610. (Unicode:#$1EB0; Attr:laUpper; CaseCode:#$1EB1), // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
  3611. (Unicode:#$1EB1; Attr:laLower; CaseCode:#$1EB0), // LATIN SMALL LETTER A WITH BREVE AND GRAVE
  3612. (Unicode:#$1EB2; Attr:laUpper; CaseCode:#$1EB3), // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
  3613. (Unicode:#$1EB3; Attr:laLower; CaseCode:#$1EB2), // LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
  3614. (Unicode:#$1EB4; Attr:laUpper; CaseCode:#$1EB5), // LATIN CAPITAL LETTER A WITH BREVE AND TILDE
  3615. (Unicode:#$1EB5; Attr:laLower; CaseCode:#$1EB4), // LATIN SMALL LETTER A WITH BREVE AND TILDE
  3616. (Unicode:#$1EB6; Attr:laUpper; CaseCode:#$1EB7), // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
  3617. (Unicode:#$1EB7; Attr:laLower; CaseCode:#$1EB6), // LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
  3618. (Unicode:#$1EB8; Attr:laUpper; CaseCode:#$1EB9), // LATIN CAPITAL LETTER E WITH DOT BELOW
  3619. (Unicode:#$1EB9; Attr:laLower; CaseCode:#$1EB8), // LATIN SMALL LETTER E WITH DOT BELOW
  3620. (Unicode:#$1EBA; Attr:laUpper; CaseCode:#$1EBB), // LATIN CAPITAL LETTER E WITH HOOK ABOVE
  3621. (Unicode:#$1EBB; Attr:laLower; CaseCode:#$1EBA), // LATIN SMALL LETTER E WITH HOOK ABOVE
  3622. (Unicode:#$1EBC; Attr:laUpper; CaseCode:#$1EBD), // LATIN CAPITAL LETTER E WITH TILDE
  3623. (Unicode:#$1EBD; Attr:laLower; CaseCode:#$1EBC), // LATIN SMALL LETTER E WITH TILDE
  3624. (Unicode:#$1EBE; Attr:laUpper; CaseCode:#$1EBF), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
  3625. (Unicode:#$1EBF; Attr:laLower; CaseCode:#$1EBE), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
  3626. (Unicode:#$1EC0; Attr:laUpper; CaseCode:#$1EC1), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
  3627. (Unicode:#$1EC1; Attr:laLower; CaseCode:#$1EC0), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
  3628. (Unicode:#$1EC2; Attr:laUpper; CaseCode:#$1EC3), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
  3629. (Unicode:#$1EC3; Attr:laLower; CaseCode:#$1EC2), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
  3630. (Unicode:#$1EC4; Attr:laUpper; CaseCode:#$1EC5), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
  3631. (Unicode:#$1EC5; Attr:laLower; CaseCode:#$1EC4), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
  3632. (Unicode:#$1EC6; Attr:laUpper; CaseCode:#$1EC7), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
  3633. (Unicode:#$1EC7; Attr:laLower; CaseCode:#$1EC6), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
  3634. (Unicode:#$1EC8; Attr:laUpper; CaseCode:#$1EC9), // LATIN CAPITAL LETTER I WITH HOOK ABOVE
  3635. (Unicode:#$1EC9; Attr:laLower; CaseCode:#$1EC8), // LATIN SMALL LETTER I WITH HOOK ABOVE
  3636. (Unicode:#$1ECA; Attr:laUpper; CaseCode:#$1ECB), // LATIN CAPITAL LETTER I WITH DOT BELOW
  3637. (Unicode:#$1ECB; Attr:laLower; CaseCode:#$1ECA), // LATIN SMALL LETTER I WITH DOT BELOW
  3638. (Unicode:#$1ECC; Attr:laUpper; CaseCode:#$1ECD), // LATIN CAPITAL LETTER O WITH DOT BELOW
  3639. (Unicode:#$1ECD; Attr:laLower; CaseCode:#$1ECC), // LATIN SMALL LETTER O WITH DOT BELOW
  3640. (Unicode:#$1ECE; Attr:laUpper; CaseCode:#$1ECF), // LATIN CAPITAL LETTER O WITH HOOK ABOVE
  3641. (Unicode:#$1ECF; Attr:laLower; CaseCode:#$1ECE), // LATIN SMALL LETTER O WITH HOOK ABOVE
  3642. (Unicode:#$1ED0; Attr:laUpper; CaseCode:#$1ED1), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
  3643. (Unicode:#$1ED1; Attr:laLower; CaseCode:#$1ED0), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
  3644. (Unicode:#$1ED2; Attr:laUpper; CaseCode:#$1ED3), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
  3645. (Unicode:#$1ED3; Attr:laLower; CaseCode:#$1ED2), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
  3646. (Unicode:#$1ED4; Attr:laUpper; CaseCode:#$1ED5), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
  3647. (Unicode:#$1ED5; Attr:laLower; CaseCode:#$1ED4), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
  3648. (Unicode:#$1ED6; Attr:laUpper; CaseCode:#$1ED7), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
  3649. (Unicode:#$1ED7; Attr:laLower; CaseCode:#$1ED6), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
  3650. (Unicode:#$1ED8; Attr:laUpper; CaseCode:#$1ED9), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
  3651. (Unicode:#$1ED9; Attr:laLower; CaseCode:#$1ED8), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
  3652. (Unicode:#$1EDA; Attr:laUpper; CaseCode:#$1EDB), // LATIN CAPITAL LETTER O WITH HORN AND ACUTE
  3653. (Unicode:#$1EDB; Attr:laLower; CaseCode:#$1EDA), // LATIN SMALL LETTER O WITH HORN AND ACUTE
  3654. (Unicode:#$1EDC; Attr:laUpper; CaseCode:#$1EDD), // LATIN CAPITAL LETTER O WITH HORN AND GRAVE
  3655. (Unicode:#$1EDD; Attr:laLower; CaseCode:#$1EDC), // LATIN SMALL LETTER O WITH HORN AND GRAVE
  3656. (Unicode:#$1EDE; Attr:laUpper; CaseCode:#$1EDF), // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
  3657. (Unicode:#$1EDF; Attr:laLower; CaseCode:#$1EDE), // LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
  3658. (Unicode:#$1EE0; Attr:laUpper; CaseCode:#$1EE1), // LATIN CAPITAL LETTER O WITH HORN AND TILDE
  3659. (Unicode:#$1EE1; Attr:laLower; CaseCode:#$1EE0), // LATIN SMALL LETTER O WITH HORN AND TILDE
  3660. (Unicode:#$1EE2; Attr:laUpper; CaseCode:#$1EE3), // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
  3661. (Unicode:#$1EE3; Attr:laLower; CaseCode:#$1EE2), // LATIN SMALL LETTER O WITH HORN AND DOT BELOW
  3662. (Unicode:#$1EE4; Attr:laUpper; CaseCode:#$1EE5), // LATIN CAPITAL LETTER U WITH DOT BELOW
  3663. (Unicode:#$1EE5; Attr:laLower; CaseCode:#$1EE4), // LATIN SMALL LETTER U WITH DOT BELOW
  3664. (Unicode:#$1EE6; Attr:laUpper; CaseCode:#$1EE7), // LATIN CAPITAL LETTER U WITH HOOK ABOVE
  3665. (Unicode:#$1EE7; Attr:laLower; CaseCode:#$1EE6), // LATIN SMALL LETTER U WITH HOOK ABOVE
  3666. (Unicode:#$1EE8; Attr:laUpper; CaseCode:#$1EE9), // LATIN CAPITAL LETTER U WITH HORN AND ACUTE
  3667. (Unicode:#$1EE9; Attr:laLower; CaseCode:#$1EE8), // LATIN SMALL LETTER U WITH HORN AND ACUTE
  3668. (Unicode:#$1EEA; Attr:laUpper; CaseCode:#$1EEB), // LATIN CAPITAL LETTER U WITH HORN AND GRAVE
  3669. (Unicode:#$1EEB; Attr:laLower; CaseCode:#$1EEA), // LATIN SMALL LETTER U WITH HORN AND GRAVE
  3670. (Unicode:#$1EEC; Attr:laUpper; CaseCode:#$1EED), // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
  3671. (Unicode:#$1EED; Attr:laLower; CaseCode:#$1EEC), // LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
  3672. (Unicode:#$1EEE; Attr:laUpper; CaseCode:#$1EEF), // LATIN CAPITAL LETTER U WITH HORN AND TILDE
  3673. (Unicode:#$1EEF; Attr:laLower; CaseCode:#$1EEE), // LATIN SMALL LETTER U WITH HORN AND TILDE
  3674. (Unicode:#$1EF0; Attr:laUpper; CaseCode:#$1EF1), // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
  3675. (Unicode:#$1EF1; Attr:laLower; CaseCode:#$1EF0), // LATIN SMALL LETTER U WITH HORN AND DOT BELOW
  3676. (Unicode:#$1EF2; Attr:laUpper; CaseCode:#$1EF3), // LATIN CAPITAL LETTER Y WITH GRAVE
  3677. (Unicode:#$1EF3; Attr:laLower; CaseCode:#$1EF2), // LATIN SMALL LETTER Y WITH GRAVE
  3678. (Unicode:#$1EF4; Attr:laUpper; CaseCode:#$1EF5), // LATIN CAPITAL LETTER Y WITH DOT BELOW
  3679. (Unicode:#$1EF5; Attr:laLower; CaseCode:#$1EF4), // LATIN SMALL LETTER Y WITH DOT BELOW
  3680. (Unicode:#$1EF6; Attr:laUpper; CaseCode:#$1EF7), // LATIN CAPITAL LETTER Y WITH HOOK ABOVE
  3681. (Unicode:#$1EF7; Attr:laLower; CaseCode:#$1EF6), // LATIN SMALL LETTER Y WITH HOOK ABOVE
  3682. (Unicode:#$1EF8; Attr:laUpper; CaseCode:#$1EF9), // LATIN CAPITAL LETTER Y WITH TILDE
  3683. (Unicode:#$1EF9; Attr:laLower; CaseCode:#$1EF8), // LATIN SMALL LETTER Y WITH TILDE
  3684. (Unicode:#$1F00; Attr:laLower; CaseCode:#$1F08), // GREEK SMALL LETTER ALPHA WITH PSILI
  3685. (Unicode:#$1F01; Attr:laLower; CaseCode:#$1F09), // GREEK SMALL LETTER ALPHA WITH DASIA
  3686. (Unicode:#$1F02; Attr:laLower; CaseCode:#$1F0A), // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
  3687. (Unicode:#$1F03; Attr:laLower; CaseCode:#$1F0B), // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
  3688. (Unicode:#$1F04; Attr:laLower; CaseCode:#$1F0C), // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
  3689. (Unicode:#$1F05; Attr:laLower; CaseCode:#$1F0D), // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
  3690. (Unicode:#$1F06; Attr:laLower; CaseCode:#$1F0E), // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
  3691. (Unicode:#$1F07; Attr:laLower; CaseCode:#$1F0F), // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
  3692. (Unicode:#$1F08; Attr:laUpper; CaseCode:#$1F00), // GREEK CAPITAL LETTER ALPHA WITH PSILI
  3693. (Unicode:#$1F09; Attr:laUpper; CaseCode:#$1F01), // GREEK CAPITAL LETTER ALPHA WITH DASIA
  3694. (Unicode:#$1F0A; Attr:laUpper; CaseCode:#$1F02), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
  3695. (Unicode:#$1F0B; Attr:laUpper; CaseCode:#$1F03), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
  3696. (Unicode:#$1F0C; Attr:laUpper; CaseCode:#$1F04), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
  3697. (Unicode:#$1F0D; Attr:laUpper; CaseCode:#$1F05), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
  3698. (Unicode:#$1F0E; Attr:laUpper; CaseCode:#$1F06), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
  3699. (Unicode:#$1F0F; Attr:laUpper; CaseCode:#$1F07), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
  3700. (Unicode:#$1F10; Attr:laLower; CaseCode:#$1F18), // GREEK SMALL LETTER EPSILON WITH PSILI
  3701. (Unicode:#$1F11; Attr:laLower; CaseCode:#$1F19), // GREEK SMALL LETTER EPSILON WITH DASIA
  3702. (Unicode:#$1F12; Attr:laLower; CaseCode:#$1F1A), // GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
  3703. (Unicode:#$1F13; Attr:laLower; CaseCode:#$1F1B), // GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
  3704. (Unicode:#$1F14; Attr:laLower; CaseCode:#$1F1C), // GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
  3705. (Unicode:#$1F15; Attr:laLower; CaseCode:#$1F1D), // GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
  3706. (Unicode:#$1F18; Attr:laUpper; CaseCode:#$1F10), // GREEK CAPITAL LETTER EPSILON WITH PSILI
  3707. (Unicode:#$1F19; Attr:laUpper; CaseCode:#$1F11), // GREEK CAPITAL LETTER EPSILON WITH DASIA
  3708. (Unicode:#$1F1A; Attr:laUpper; CaseCode:#$1F12), // GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
  3709. (Unicode:#$1F1B; Attr:laUpper; CaseCode:#$1F13), // GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
  3710. (Unicode:#$1F1C; Attr:laUpper; CaseCode:#$1F14), // GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
  3711. (Unicode:#$1F1D; Attr:laUpper; CaseCode:#$1F15), // GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
  3712. (Unicode:#$1F20; Attr:laLower; CaseCode:#$1F28), // GREEK SMALL LETTER ETA WITH PSILI
  3713. (Unicode:#$1F21; Attr:laLower; CaseCode:#$1F29), // GREEK SMALL LETTER ETA WITH DASIA
  3714. (Unicode:#$1F22; Attr:laLower; CaseCode:#$1F2A), // GREEK SMALL LETTER ETA WITH PSILI AND VARIA
  3715. (Unicode:#$1F23; Attr:laLower; CaseCode:#$1F2B), // GREEK SMALL LETTER ETA WITH DASIA AND VARIA
  3716. (Unicode:#$1F24; Attr:laLower; CaseCode:#$1F2C), // GREEK SMALL LETTER ETA WITH PSILI AND OXIA
  3717. (Unicode:#$1F25; Attr:laLower; CaseCode:#$1F2D), // GREEK SMALL LETTER ETA WITH DASIA AND OXIA
  3718. (Unicode:#$1F26; Attr:laLower; CaseCode:#$1F2E), // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
  3719. (Unicode:#$1F27; Attr:laLower; CaseCode:#$1F2F), // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
  3720. (Unicode:#$1F28; Attr:laUpper; CaseCode:#$1F20), // GREEK CAPITAL LETTER ETA WITH PSILI
  3721. (Unicode:#$1F29; Attr:laUpper; CaseCode:#$1F21), // GREEK CAPITAL LETTER ETA WITH DASIA
  3722. (Unicode:#$1F2A; Attr:laUpper; CaseCode:#$1F22), // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
  3723. (Unicode:#$1F2B; Attr:laUpper; CaseCode:#$1F23), // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
  3724. (Unicode:#$1F2C; Attr:laUpper; CaseCode:#$1F24), // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
  3725. (Unicode:#$1F2D; Attr:laUpper; CaseCode:#$1F25), // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
  3726. (Unicode:#$1F2E; Attr:laUpper; CaseCode:#$1F26), // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
  3727. (Unicode:#$1F2F; Attr:laUpper; CaseCode:#$1F27), // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
  3728. (Unicode:#$1F30; Attr:laLower; CaseCode:#$1F38), // GREEK SMALL LETTER IOTA WITH PSILI
  3729. (Unicode:#$1F31; Attr:laLower; CaseCode:#$1F39), // GREEK SMALL LETTER IOTA WITH DASIA
  3730. (Unicode:#$1F32; Attr:laLower; CaseCode:#$1F3A), // GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
  3731. (Unicode:#$1F33; Attr:laLower; CaseCode:#$1F3B), // GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
  3732. (Unicode:#$1F34; Attr:laLower; CaseCode:#$1F3C), // GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
  3733. (Unicode:#$1F35; Attr:laLower; CaseCode:#$1F3D), // GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
  3734. (Unicode:#$1F36; Attr:laLower; CaseCode:#$1F3E), // GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
  3735. (Unicode:#$1F37; Attr:laLower; CaseCode:#$1F3F), // GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
  3736. (Unicode:#$1F38; Attr:laUpper; CaseCode:#$1F30), // GREEK CAPITAL LETTER IOTA WITH PSILI
  3737. (Unicode:#$1F39; Attr:laUpper; CaseCode:#$1F31), // GREEK CAPITAL LETTER IOTA WITH DASIA
  3738. (Unicode:#$1F3A; Attr:laUpper; CaseCode:#$1F32), // GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
  3739. (Unicode:#$1F3B; Attr:laUpper; CaseCode:#$1F33), // GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
  3740. (Unicode:#$1F3C; Attr:laUpper; CaseCode:#$1F34), // GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
  3741. (Unicode:#$1F3D; Attr:laUpper; CaseCode:#$1F35), // GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
  3742. (Unicode:#$1F3E; Attr:laUpper; CaseCode:#$1F36), // GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
  3743. (Unicode:#$1F3F; Attr:laUpper; CaseCode:#$1F37), // GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
  3744. (Unicode:#$1F40; Attr:laLower; CaseCode:#$1F48), // GREEK SMALL LETTER OMICRON WITH PSILI
  3745. (Unicode:#$1F41; Attr:laLower; CaseCode:#$1F49), // GREEK SMALL LETTER OMICRON WITH DASIA
  3746. (Unicode:#$1F42; Attr:laLower; CaseCode:#$1F4A), // GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
  3747. (Unicode:#$1F43; Attr:laLower; CaseCode:#$1F4B), // GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
  3748. (Unicode:#$1F44; Attr:laLower; CaseCode:#$1F4C), // GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
  3749. (Unicode:#$1F45; Attr:laLower; CaseCode:#$1F4D), // GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
  3750. (Unicode:#$1F48; Attr:laUpper; CaseCode:#$1F40), // GREEK CAPITAL LETTER OMICRON WITH PSILI
  3751. (Unicode:#$1F49; Attr:laUpper; CaseCode:#$1F41), // GREEK CAPITAL LETTER OMICRON WITH DASIA
  3752. (Unicode:#$1F4A; Attr:laUpper; CaseCode:#$1F42), // GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
  3753. (Unicode:#$1F4B; Attr:laUpper; CaseCode:#$1F43), // GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
  3754. (Unicode:#$1F4C; Attr:laUpper; CaseCode:#$1F44), // GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
  3755. (Unicode:#$1F4D; Attr:laUpper; CaseCode:#$1F45), // GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
  3756. (Unicode:#$1F50; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PSILI
  3757. (Unicode:#$1F51; Attr:laLower; CaseCode:#$1F59), // GREEK SMALL LETTER UPSILON WITH DASIA
  3758. (Unicode:#$1F52; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
  3759. (Unicode:#$1F53; Attr:laLower; CaseCode:#$1F5B), // GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
  3760. (Unicode:#$1F54; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
  3761. (Unicode:#$1F55; Attr:laLower; CaseCode:#$1F5D), // GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
  3762. (Unicode:#$1F56; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
  3763. (Unicode:#$1F57; Attr:laLower; CaseCode:#$1F5F), // GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
  3764. (Unicode:#$1F59; Attr:laUpper; CaseCode:#$1F51), // GREEK CAPITAL LETTER UPSILON WITH DASIA
  3765. (Unicode:#$1F5B; Attr:laUpper; CaseCode:#$1F53), // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
  3766. (Unicode:#$1F5D; Attr:laUpper; CaseCode:#$1F55), // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
  3767. (Unicode:#$1F5F; Attr:laUpper; CaseCode:#$1F57), // GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
  3768. (Unicode:#$1F60; Attr:laLower; CaseCode:#$1F68), // GREEK SMALL LETTER OMEGA WITH PSILI
  3769. (Unicode:#$1F61; Attr:laLower; CaseCode:#$1F69), // GREEK SMALL LETTER OMEGA WITH DASIA
  3770. (Unicode:#$1F62; Attr:laLower; CaseCode:#$1F6A), // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
  3771. (Unicode:#$1F63; Attr:laLower; CaseCode:#$1F6B), // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
  3772. (Unicode:#$1F64; Attr:laLower; CaseCode:#$1F6C), // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
  3773. (Unicode:#$1F65; Attr:laLower; CaseCode:#$1F6D), // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
  3774. (Unicode:#$1F66; Attr:laLower; CaseCode:#$1F6E), // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
  3775. (Unicode:#$1F67; Attr:laLower; CaseCode:#$1F6F), // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
  3776. (Unicode:#$1F68; Attr:laUpper; CaseCode:#$1F60), // GREEK CAPITAL LETTER OMEGA WITH PSILI
  3777. (Unicode:#$1F69; Attr:laUpper; CaseCode:#$1F61), // GREEK CAPITAL LETTER OMEGA WITH DASIA
  3778. (Unicode:#$1F6A; Attr:laUpper; CaseCode:#$1F62), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
  3779. (Unicode:#$1F6B; Attr:laUpper; CaseCode:#$1F63), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
  3780. (Unicode:#$1F6C; Attr:laUpper; CaseCode:#$1F64), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
  3781. (Unicode:#$1F6D; Attr:laUpper; CaseCode:#$1F65), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
  3782. (Unicode:#$1F6E; Attr:laUpper; CaseCode:#$1F66), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
  3783. (Unicode:#$1F6F; Attr:laUpper; CaseCode:#$1F67), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
  3784. (Unicode:#$1F70; Attr:laLower; CaseCode:#$1FBA), // GREEK SMALL LETTER ALPHA WITH VARIA
  3785. (Unicode:#$1F71; Attr:laLower; CaseCode:#$1FBB), // GREEK SMALL LETTER ALPHA WITH OXIA
  3786. (Unicode:#$1F72; Attr:laLower; CaseCode:#$1FC8), // GREEK SMALL LETTER EPSILON WITH VARIA
  3787. (Unicode:#$1F73; Attr:laLower; CaseCode:#$1FC9), // GREEK SMALL LETTER EPSILON WITH OXIA
  3788. (Unicode:#$1F74; Attr:laLower; CaseCode:#$1FCA), // GREEK SMALL LETTER ETA WITH VARIA
  3789. (Unicode:#$1F75; Attr:laLower; CaseCode:#$1FCB), // GREEK SMALL LETTER ETA WITH OXIA
  3790. (Unicode:#$1F76; Attr:laLower; CaseCode:#$1FDA), // GREEK SMALL LETTER IOTA WITH VARIA
  3791. (Unicode:#$1F77; Attr:laLower; CaseCode:#$1FDB), // GREEK SMALL LETTER IOTA WITH OXIA
  3792. (Unicode:#$1F78; Attr:laLower; CaseCode:#$1FF8), // GREEK SMALL LETTER OMICRON WITH VARIA
  3793. (Unicode:#$1F79; Attr:laLower; CaseCode:#$1FF9), // GREEK SMALL LETTER OMICRON WITH OXIA
  3794. (Unicode:#$1F7A; Attr:laLower; CaseCode:#$1FEA), // GREEK SMALL LETTER UPSILON WITH VARIA
  3795. (Unicode:#$1F7B; Attr:laLower; CaseCode:#$1FEB), // GREEK SMALL LETTER UPSILON WITH OXIA
  3796. (Unicode:#$1F7C; Attr:laLower; CaseCode:#$1FFA), // GREEK SMALL LETTER OMEGA WITH VARIA
  3797. (Unicode:#$1F7D; Attr:laLower; CaseCode:#$1FFB), // GREEK SMALL LETTER OMEGA WITH OXIA
  3798. (Unicode:#$1F80; Attr:laLower; CaseCode:#$1F88), // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
  3799. (Unicode:#$1F81; Attr:laLower; CaseCode:#$1F89), // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
  3800. (Unicode:#$1F82; Attr:laLower; CaseCode:#$1F8A), // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  3801. (Unicode:#$1F83; Attr:laLower; CaseCode:#$1F8B), // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  3802. (Unicode:#$1F84; Attr:laLower; CaseCode:#$1F8C), // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  3803. (Unicode:#$1F85; Attr:laLower; CaseCode:#$1F8D), // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  3804. (Unicode:#$1F86; Attr:laLower; CaseCode:#$1F8E), // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  3805. (Unicode:#$1F87; Attr:laLower; CaseCode:#$1F8F), // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  3806. (Unicode:#$1F90; Attr:laLower; CaseCode:#$1F98), // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
  3807. (Unicode:#$1F91; Attr:laLower; CaseCode:#$1F99), // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
  3808. (Unicode:#$1F92; Attr:laLower; CaseCode:#$1F9A), // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  3809. (Unicode:#$1F93; Attr:laLower; CaseCode:#$1F9B), // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  3810. (Unicode:#$1F94; Attr:laLower; CaseCode:#$1F9C), // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  3811. (Unicode:#$1F95; Attr:laLower; CaseCode:#$1F9D), // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  3812. (Unicode:#$1F96; Attr:laLower; CaseCode:#$1F9E), // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  3813. (Unicode:#$1F97; Attr:laLower; CaseCode:#$1F9F), // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  3814. (Unicode:#$1FA0; Attr:laLower; CaseCode:#$1FA8), // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
  3815. (Unicode:#$1FA1; Attr:laLower; CaseCode:#$1FA9), // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
  3816. (Unicode:#$1FA2; Attr:laLower; CaseCode:#$1FAA), // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  3817. (Unicode:#$1FA3; Attr:laLower; CaseCode:#$1FAB), // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  3818. (Unicode:#$1FA4; Attr:laLower; CaseCode:#$1FAC), // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  3819. (Unicode:#$1FA5; Attr:laLower; CaseCode:#$1FAD), // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  3820. (Unicode:#$1FA6; Attr:laLower; CaseCode:#$1FAE), // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  3821. (Unicode:#$1FA7; Attr:laLower; CaseCode:#$1FAF), // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  3822. (Unicode:#$1FB0; Attr:laLower; CaseCode:#$1FB8), // GREEK SMALL LETTER ALPHA WITH VRACHY
  3823. (Unicode:#$1FB1; Attr:laLower; CaseCode:#$1FB9), // GREEK SMALL LETTER ALPHA WITH MACRON
  3824. (Unicode:#$1FB2; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
  3825. (Unicode:#$1FB3; Attr:laLower; CaseCode:#$1FBC), // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
  3826. (Unicode:#$1FB4; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
  3827. (Unicode:#$1FB6; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PERISPOMENI
  3828. (Unicode:#$1FB7; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
  3829. (Unicode:#$1FB8; Attr:laUpper; CaseCode:#$1FB0), // GREEK CAPITAL LETTER ALPHA WITH VRACHY
  3830. (Unicode:#$1FB9; Attr:laUpper; CaseCode:#$1FB1), // GREEK CAPITAL LETTER ALPHA WITH MACRON
  3831. (Unicode:#$1FBA; Attr:laUpper; CaseCode:#$1F70), // GREEK CAPITAL LETTER ALPHA WITH VARIA
  3832. (Unicode:#$1FBB; Attr:laUpper; CaseCode:#$1F71), // GREEK CAPITAL LETTER ALPHA WITH OXIA
  3833. (Unicode:#$1FBE; Attr:laLower; CaseCode:#$0399), // GREEK PROSGEGRAMMENI
  3834. (Unicode:#$1FC2; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
  3835. (Unicode:#$1FC3; Attr:laLower; CaseCode:#$1FCC), // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
  3836. (Unicode:#$1FC4; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
  3837. (Unicode:#$1FC6; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER ETA WITH PERISPOMENI
  3838. (Unicode:#$1FC7; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
  3839. (Unicode:#$1FC8; Attr:laUpper; CaseCode:#$1F72), // GREEK CAPITAL LETTER EPSILON WITH VARIA
  3840. (Unicode:#$1FC9; Attr:laUpper; CaseCode:#$1F73), // GREEK CAPITAL LETTER EPSILON WITH OXIA
  3841. (Unicode:#$1FCA; Attr:laUpper; CaseCode:#$1F74), // GREEK CAPITAL LETTER ETA WITH VARIA
  3842. (Unicode:#$1FCB; Attr:laUpper; CaseCode:#$1F75), // GREEK CAPITAL LETTER ETA WITH OXIA
  3843. (Unicode:#$1FD0; Attr:laLower; CaseCode:#$1FD8), // GREEK SMALL LETTER IOTA WITH VRACHY
  3844. (Unicode:#$1FD1; Attr:laLower; CaseCode:#$1FD9), // GREEK SMALL LETTER IOTA WITH MACRON
  3845. (Unicode:#$1FD2; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
  3846. (Unicode:#$1FD3; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
  3847. (Unicode:#$1FD6; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER IOTA WITH PERISPOMENI
  3848. (Unicode:#$1FD7; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
  3849. (Unicode:#$1FD8; Attr:laUpper; CaseCode:#$1FD0), // GREEK CAPITAL LETTER IOTA WITH VRACHY
  3850. (Unicode:#$1FD9; Attr:laUpper; CaseCode:#$1FD1), // GREEK CAPITAL LETTER IOTA WITH MACRON
  3851. (Unicode:#$1FDA; Attr:laUpper; CaseCode:#$1F76), // GREEK CAPITAL LETTER IOTA WITH VARIA
  3852. (Unicode:#$1FDB; Attr:laUpper; CaseCode:#$1F77), // GREEK CAPITAL LETTER IOTA WITH OXIA
  3853. (Unicode:#$1FE0; Attr:laLower; CaseCode:#$1FE8), // GREEK SMALL LETTER UPSILON WITH VRACHY
  3854. (Unicode:#$1FE1; Attr:laLower; CaseCode:#$1FE9), // GREEK SMALL LETTER UPSILON WITH MACRON
  3855. (Unicode:#$1FE2; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
  3856. (Unicode:#$1FE3; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
  3857. (Unicode:#$1FE4; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER RHO WITH PSILI
  3858. (Unicode:#$1FE5; Attr:laLower; CaseCode:#$1FEC), // GREEK SMALL LETTER RHO WITH DASIA
  3859. (Unicode:#$1FE6; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PERISPOMENI
  3860. (Unicode:#$1FE7; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
  3861. (Unicode:#$1FE8; Attr:laUpper; CaseCode:#$1FE0), // GREEK CAPITAL LETTER UPSILON WITH VRACHY
  3862. (Unicode:#$1FE9; Attr:laUpper; CaseCode:#$1FE1), // GREEK CAPITAL LETTER UPSILON WITH MACRON
  3863. (Unicode:#$1FEA; Attr:laUpper; CaseCode:#$1F7A), // GREEK CAPITAL LETTER UPSILON WITH VARIA
  3864. (Unicode:#$1FEB; Attr:laUpper; CaseCode:#$1F7B), // GREEK CAPITAL LETTER UPSILON WITH OXIA
  3865. (Unicode:#$1FEC; Attr:laUpper; CaseCode:#$1FE5), // GREEK CAPITAL LETTER RHO WITH DASIA
  3866. (Unicode:#$1FF2; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
  3867. (Unicode:#$1FF3; Attr:laLower; CaseCode:#$1FFC), // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
  3868. (Unicode:#$1FF4; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
  3869. (Unicode:#$1FF6; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PERISPOMENI
  3870. (Unicode:#$1FF7; Attr:laLower; CaseCode:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
  3871. (Unicode:#$1FF8; Attr:laUpper; CaseCode:#$1F78), // GREEK CAPITAL LETTER OMICRON WITH VARIA
  3872. (Unicode:#$1FF9; Attr:laUpper; CaseCode:#$1F79), // GREEK CAPITAL LETTER OMICRON WITH OXIA
  3873. (Unicode:#$1FFA; Attr:laUpper; CaseCode:#$1F7C), // GREEK CAPITAL LETTER OMEGA WITH VARIA
  3874. (Unicode:#$1FFB; Attr:laUpper; CaseCode:#$1F7D), // GREEK CAPITAL LETTER OMEGA WITH OXIA
  3875. (Unicode:#$207F; Attr:laLower; CaseCode:#$FFFF), // SUPERSCRIPT LATIN SMALL LETTER N
  3876. (Unicode:#$2102; Attr:laUpper; CaseCode:#$FFFF), // DOUBLE-STRUCK CAPITAL C
  3877. (Unicode:#$2107; Attr:laUpper; CaseCode:#$FFFF), // EULER CONSTANT
  3878. (Unicode:#$210A; Attr:laLower; CaseCode:#$FFFF), // SCRIPT SMALL G
  3879. (Unicode:#$210B; Attr:laUpper; CaseCode:#$FFFF), // SCRIPT CAPITAL H
  3880. (Unicode:#$210C; Attr:laUpper; CaseCode:#$FFFF), // BLACK-LETTER CAPITAL H
  3881. (Unicode:#$210D; Attr:laUpper; CaseCode:#$FFFF), // DOUBLE-STRUCK CAPITAL H
  3882. (Unicode:#$210E; Attr:laLower; CaseCode:#$FFFF), // PLANCK CONSTANT
  3883. (Unicode:#$210F; Attr:laLower; CaseCode:#$FFFF), // PLANCK CONSTANT OVER TWO PI
  3884. (Unicode:#$2110; Attr:laUpper; CaseCode:#$FFFF), // SCRIPT CAPITAL I
  3885. (Unicode:#$2111; Attr:laUpper; CaseCode:#$FFFF), // BLACK-LETTER CAPITAL I
  3886. (Unicode:#$2112; Attr:laUpper; CaseCode:#$FFFF), // SCRIPT CAPITAL L
  3887. (Unicode:#$2113; Attr:laLower; CaseCode:#$FFFF), // SCRIPT SMALL L
  3888. (Unicode:#$2115; Attr:laUpper; CaseCode:#$FFFF), // DOUBLE-STRUCK CAPITAL N
  3889. (Unicode:#$2119; Attr:laUpper; CaseCode:#$FFFF), // DOUBLE-STRUCK CAPITAL P
  3890. (Unicode:#$211A; Attr:laUpper; CaseCode:#$FFFF), // DOUBLE-STRUCK CAPITAL Q
  3891. (Unicode:#$211B; Attr:laUpper; CaseCode:#$FFFF), // SCRIPT CAPITAL R
  3892. (Unicode:#$211C; Attr:laUpper; CaseCode:#$FFFF), // BLACK-LETTER CAPITAL R
  3893. (Unicode:#$211D; Attr:laUpper; CaseCode:#$FFFF), // DOUBLE-STRUCK CAPITAL R
  3894. (Unicode:#$2124; Attr:laUpper; CaseCode:#$FFFF), // DOUBLE-STRUCK CAPITAL Z
  3895. (Unicode:#$2126; Attr:laUpper; CaseCode:#$03C9), // OHM SIGN
  3896. (Unicode:#$2128; Attr:laUpper; CaseCode:#$FFFF), // BLACK-LETTER CAPITAL Z
  3897. (Unicode:#$212A; Attr:laUpper; CaseCode:#$006B), // KELVIN SIGN
  3898. (Unicode:#$212B; Attr:laUpper; CaseCode:#$00E5), // ANGSTROM SIGN
  3899. (Unicode:#$212C; Attr:laUpper; CaseCode:#$FFFF), // SCRIPT CAPITAL B
  3900. (Unicode:#$212D; Attr:laUpper; CaseCode:#$FFFF), // BLACK-LETTER CAPITAL C
  3901. (Unicode:#$212F; Attr:laLower; CaseCode:#$FFFF), // SCRIPT SMALL E
  3902. (Unicode:#$2130; Attr:laUpper; CaseCode:#$FFFF), // SCRIPT CAPITAL E
  3903. (Unicode:#$2131; Attr:laUpper; CaseCode:#$FFFF), // SCRIPT CAPITAL F
  3904. (Unicode:#$2133; Attr:laUpper; CaseCode:#$FFFF), // SCRIPT CAPITAL M
  3905. (Unicode:#$2134; Attr:laLower; CaseCode:#$FFFF), // SCRIPT SMALL O
  3906. (Unicode:#$2139; Attr:laLower; CaseCode:#$FFFF), // INFORMATION SOURCE
  3907. (Unicode:#$FB00; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LIGATURE FF
  3908. (Unicode:#$FB01; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LIGATURE FI
  3909. (Unicode:#$FB02; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LIGATURE FL
  3910. (Unicode:#$FB03; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LIGATURE FFI
  3911. (Unicode:#$FB04; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LIGATURE FFL
  3912. (Unicode:#$FB05; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LIGATURE LONG S T
  3913. (Unicode:#$FB06; Attr:laLower; CaseCode:#$FFFF), // LATIN SMALL LIGATURE ST
  3914. (Unicode:#$FB13; Attr:laLower; CaseCode:#$FFFF), // ARMENIAN SMALL LIGATURE MEN NOW
  3915. (Unicode:#$FB14; Attr:laLower; CaseCode:#$FFFF), // ARMENIAN SMALL LIGATURE MEN ECH
  3916. (Unicode:#$FB15; Attr:laLower; CaseCode:#$FFFF), // ARMENIAN SMALL LIGATURE MEN INI
  3917. (Unicode:#$FB16; Attr:laLower; CaseCode:#$FFFF), // ARMENIAN SMALL LIGATURE VEW NOW
  3918. (Unicode:#$FB17; Attr:laLower; CaseCode:#$FFFF), // ARMENIAN SMALL LIGATURE MEN XEH
  3919. (Unicode:#$FF21; Attr:laUpper; CaseCode:#$FF41), // FULLWIDTH LATIN CAPITAL LETTER A
  3920. (Unicode:#$FF22; Attr:laUpper; CaseCode:#$FF42), // FULLWIDTH LATIN CAPITAL LETTER B
  3921. (Unicode:#$FF23; Attr:laUpper; CaseCode:#$FF43), // FULLWIDTH LATIN CAPITAL LETTER C
  3922. (Unicode:#$FF24; Attr:laUpper; CaseCode:#$FF44), // FULLWIDTH LATIN CAPITAL LETTER D
  3923. (Unicode:#$FF25; Attr:laUpper; CaseCode:#$FF45), // FULLWIDTH LATIN CAPITAL LETTER E
  3924. (Unicode:#$FF26; Attr:laUpper; CaseCode:#$FF46), // FULLWIDTH LATIN CAPITAL LETTER F
  3925. (Unicode:#$FF27; Attr:laUpper; CaseCode:#$FF47), // FULLWIDTH LATIN CAPITAL LETTER G
  3926. (Unicode:#$FF28; Attr:laUpper; CaseCode:#$FF48), // FULLWIDTH LATIN CAPITAL LETTER H
  3927. (Unicode:#$FF29; Attr:laUpper; CaseCode:#$FF49), // FULLWIDTH LATIN CAPITAL LETTER I
  3928. (Unicode:#$FF2A; Attr:laUpper; CaseCode:#$FF4A), // FULLWIDTH LATIN CAPITAL LETTER J
  3929. (Unicode:#$FF2B; Attr:laUpper; CaseCode:#$FF4B), // FULLWIDTH LATIN CAPITAL LETTER K
  3930. (Unicode:#$FF2C; Attr:laUpper; CaseCode:#$FF4C), // FULLWIDTH LATIN CAPITAL LETTER L
  3931. (Unicode:#$FF2D; Attr:laUpper; CaseCode:#$FF4D), // FULLWIDTH LATIN CAPITAL LETTER M
  3932. (Unicode:#$FF2E; Attr:laUpper; CaseCode:#$FF4E), // FULLWIDTH LATIN CAPITAL LETTER N
  3933. (Unicode:#$FF2F; Attr:laUpper; CaseCode:#$FF4F), // FULLWIDTH LATIN CAPITAL LETTER O
  3934. (Unicode:#$FF30; Attr:laUpper; CaseCode:#$FF50), // FULLWIDTH LATIN CAPITAL LETTER P
  3935. (Unicode:#$FF31; Attr:laUpper; CaseCode:#$FF51), // FULLWIDTH LATIN CAPITAL LETTER Q
  3936. (Unicode:#$FF32; Attr:laUpper; CaseCode:#$FF52), // FULLWIDTH LATIN CAPITAL LETTER R
  3937. (Unicode:#$FF33; Attr:laUpper; CaseCode:#$FF53), // FULLWIDTH LATIN CAPITAL LETTER S
  3938. (Unicode:#$FF34; Attr:laUpper; CaseCode:#$FF54), // FULLWIDTH LATIN CAPITAL LETTER T
  3939. (Unicode:#$FF35; Attr:laUpper; CaseCode:#$FF55), // FULLWIDTH LATIN CAPITAL LETTER U
  3940. (Unicode:#$FF36; Attr:laUpper; CaseCode:#$FF56), // FULLWIDTH LATIN CAPITAL LETTER V
  3941. (Unicode:#$FF37; Attr:laUpper; CaseCode:#$FF57), // FULLWIDTH LATIN CAPITAL LETTER W
  3942. (Unicode:#$FF38; Attr:laUpper; CaseCode:#$FF58), // FULLWIDTH LATIN CAPITAL LETTER X
  3943. (Unicode:#$FF39; Attr:laUpper; CaseCode:#$FF59), // FULLWIDTH LATIN CAPITAL LETTER Y
  3944. (Unicode:#$FF3A; Attr:laUpper; CaseCode:#$FF5A), // FULLWIDTH LATIN CAPITAL LETTER Z
  3945. (Unicode:#$FF41; Attr:laLower; CaseCode:#$FF21), // FULLWIDTH LATIN SMALL LETTER A
  3946. (Unicode:#$FF42; Attr:laLower; CaseCode:#$FF22), // FULLWIDTH LATIN SMALL LETTER B
  3947. (Unicode:#$FF43; Attr:laLower; CaseCode:#$FF23), // FULLWIDTH LATIN SMALL LETTER C
  3948. (Unicode:#$FF44; Attr:laLower; CaseCode:#$FF24), // FULLWIDTH LATIN SMALL LETTER D
  3949. (Unicode:#$FF45; Attr:laLower; CaseCode:#$FF25), // FULLWIDTH LATIN SMALL LETTER E
  3950. (Unicode:#$FF46; Attr:laLower; CaseCode:#$FF26), // FULLWIDTH LATIN SMALL LETTER F
  3951. (Unicode:#$FF47; Attr:laLower; CaseCode:#$FF27), // FULLWIDTH LATIN SMALL LETTER G
  3952. (Unicode:#$FF48; Attr:laLower; CaseCode:#$FF28), // FULLWIDTH LATIN SMALL LETTER H
  3953. (Unicode:#$FF49; Attr:laLower; CaseCode:#$FF29), // FULLWIDTH LATIN SMALL LETTER I
  3954. (Unicode:#$FF4A; Attr:laLower; CaseCode:#$FF2A), // FULLWIDTH LATIN SMALL LETTER J
  3955. (Unicode:#$FF4B; Attr:laLower; CaseCode:#$FF2B), // FULLWIDTH LATIN SMALL LETTER K
  3956. (Unicode:#$FF4C; Attr:laLower; CaseCode:#$FF2C), // FULLWIDTH LATIN SMALL LETTER L
  3957. (Unicode:#$FF4D; Attr:laLower; CaseCode:#$FF2D), // FULLWIDTH LATIN SMALL LETTER M
  3958. (Unicode:#$FF4E; Attr:laLower; CaseCode:#$FF2E), // FULLWIDTH LATIN SMALL LETTER N
  3959. (Unicode:#$FF4F; Attr:laLower; CaseCode:#$FF2F), // FULLWIDTH LATIN SMALL LETTER O
  3960. (Unicode:#$FF50; Attr:laLower; CaseCode:#$FF30), // FULLWIDTH LATIN SMALL LETTER P
  3961. (Unicode:#$FF51; Attr:laLower; CaseCode:#$FF31), // FULLWIDTH LATIN SMALL LETTER Q
  3962. (Unicode:#$FF52; Attr:laLower; CaseCode:#$FF32), // FULLWIDTH LATIN SMALL LETTER R
  3963. (Unicode:#$FF53; Attr:laLower; CaseCode:#$FF33), // FULLWIDTH LATIN SMALL LETTER S
  3964. (Unicode:#$FF54; Attr:laLower; CaseCode:#$FF34), // FULLWIDTH LATIN SMALL LETTER T
  3965. (Unicode:#$FF55; Attr:laLower; CaseCode:#$FF35), // FULLWIDTH LATIN SMALL LETTER U
  3966. (Unicode:#$FF56; Attr:laLower; CaseCode:#$FF36), // FULLWIDTH LATIN SMALL LETTER V
  3967. (Unicode:#$FF57; Attr:laLower; CaseCode:#$FF37), // FULLWIDTH LATIN SMALL LETTER W
  3968. (Unicode:#$FF58; Attr:laLower; CaseCode:#$FF38), // FULLWIDTH LATIN SMALL LETTER X
  3969. (Unicode:#$FF59; Attr:laLower; CaseCode:#$FF39), // FULLWIDTH LATIN SMALL LETTER Y
  3970. (Unicode:#$FF5A; Attr:laLower; CaseCode:#$FF3A) // FULLWIDTH LATIN SMALL LETTER Z
  3971. );
  3972. function UnicodeLocateLetterInfo(const Ch: WideChar): Integer;
  3973. var L, H, I : Integer;
  3974. D : WideChar;
  3975. begin
  3976. // Binary search [Avg number of comparisons = Log2(UnicodeLetterEntries) = 10]
  3977. L := 0;
  3978. H := UnicodeLetterEntries - 1;
  3979. repeat
  3980. I := (L + H) div 2;
  3981. D := UnicodeLetterInfo[I].Unicode;
  3982. if D = Ch then
  3983. begin
  3984. Result := I;
  3985. exit;
  3986. end else
  3987. if D > Ch then
  3988. H := I - 1
  3989. else
  3990. L := I + 1;
  3991. until L > H;
  3992. Result := -1;
  3993. end;
  3994. function UnicodeLocateOtherLowerCase(const Ch: WideChar): WideChar;
  3995. begin
  3996. case Ord(Ch) of
  3997. $2170..$217F : Result := WideChar(Ord(Ch) - $2170 + $2160); // # Nl [16] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
  3998. $24D0..$24E9 : Result := WideChar(Ord(Ch) - $24D0 + $24B6); // # So [26] CIRCLED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
  3999. else
  4000. Result := #$0000;
  4001. end;
  4002. end;
  4003. function UnicodeLocateOtherUpperCase(const Ch: WideChar): WideChar;
  4004. begin
  4005. case Ord(Ch) of
  4006. $2160..$216F : Result := WideChar(Ord(Ch) - $2160 + $2170); // # Nl [16] ROMAN NUMERAL ONE..ROMAN NUMERAL ONE THOUSAND
  4007. $24B6..$24CF : Result := WideChar(Ord(Ch) - $24B6 + $24D0); // # So [26] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN CAPITAL LETTER Z
  4008. else
  4009. Result := #$0000;
  4010. end;
  4011. end;
  4012. function UnicodeIsUpperCase(const Ch: WideChar): Boolean;
  4013. var I : Integer;
  4014. begin
  4015. I := UnicodeLocateLetterInfo(Ch);
  4016. if I >= 0 then
  4017. Result := UnicodeLetterInfo[I].Attr = laUpper
  4018. else
  4019. Result := UnicodeLocateOtherUpperCase(Ch) <> #$0000;
  4020. end;
  4021. function UnicodeIsLowerCase(const Ch: WideChar): Boolean;
  4022. var I : Integer;
  4023. begin
  4024. I := UnicodeLocateLetterInfo(Ch);
  4025. if I >= 0 then
  4026. Result := UnicodeLetterInfo[I].Attr = laLower
  4027. else
  4028. Result := UnicodeLocateOtherLowerCase(Ch) <> #$0000;
  4029. end;
  4030. type
  4031. TUnicodeTitleCaseLetterInfo = packed record
  4032. Unicode : WideChar;
  4033. Upper : WideChar;
  4034. Lower : WideChar;
  4035. end;
  4036. PUnicodeTitleCaseLetterInfo = ^TUnicodeTitleCaseLetterInfo;
  4037. const
  4038. // Derived from 'Lt' class
  4039. UnicodeTitleCaseLetterEntries = 31;
  4040. UnicodeTitleCaseLetterInfo : Array[0..UnicodeTitleCaseLetterEntries - 1] of TUnicodeTitleCaseLetterInfo = (
  4041. (Unicode:#$01C5; Upper:#$01C4; Lower:#$01C6), // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
  4042. (Unicode:#$01C8; Upper:#$01C7; Lower:#$01C9), // LATIN CAPITAL LETTER L WITH SMALL LETTER J
  4043. (Unicode:#$01CB; Upper:#$01CA; Lower:#$01CC), // LATIN CAPITAL LETTER N WITH SMALL LETTER J
  4044. (Unicode:#$01F2; Upper:#$01F1; Lower:#$01F3), // LATIN CAPITAL LETTER D WITH SMALL LETTER Z
  4045. (Unicode:#$1F88; Upper:#$FFFF; Lower:#$1F80), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
  4046. (Unicode:#$1F89; Upper:#$FFFF; Lower:#$1F81), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
  4047. (Unicode:#$1F8A; Upper:#$FFFF; Lower:#$1F82), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  4048. (Unicode:#$1F8B; Upper:#$FFFF; Lower:#$1F83), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  4049. (Unicode:#$1F8C; Upper:#$FFFF; Lower:#$1F84), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  4050. (Unicode:#$1F8D; Upper:#$FFFF; Lower:#$1F85), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  4051. (Unicode:#$1F8E; Upper:#$FFFF; Lower:#$1F86), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  4052. (Unicode:#$1F8F; Upper:#$FFFF; Lower:#$1F87), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  4053. (Unicode:#$1F98; Upper:#$FFFF; Lower:#$1F90), // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
  4054. (Unicode:#$1F99; Upper:#$FFFF; Lower:#$1F91), // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
  4055. (Unicode:#$1F9A; Upper:#$FFFF; Lower:#$1F92), // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  4056. (Unicode:#$1F9B; Upper:#$FFFF; Lower:#$1F93), // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  4057. (Unicode:#$1F9C; Upper:#$FFFF; Lower:#$1F94), // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  4058. (Unicode:#$1F9D; Upper:#$FFFF; Lower:#$1F95), // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  4059. (Unicode:#$1F9E; Upper:#$FFFF; Lower:#$1F96), // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  4060. (Unicode:#$1F9F; Upper:#$FFFF; Lower:#$1F97), // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  4061. (Unicode:#$1FA8; Upper:#$FFFF; Lower:#$1FA0), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
  4062. (Unicode:#$1FA9; Upper:#$FFFF; Lower:#$1FA1), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
  4063. (Unicode:#$1FAA; Upper:#$FFFF; Lower:#$1FA2), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  4064. (Unicode:#$1FAB; Upper:#$FFFF; Lower:#$1FA3), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  4065. (Unicode:#$1FAC; Upper:#$FFFF; Lower:#$1FA4), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  4066. (Unicode:#$1FAD; Upper:#$FFFF; Lower:#$1FA5), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  4067. (Unicode:#$1FAE; Upper:#$FFFF; Lower:#$1FA6), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  4068. (Unicode:#$1FAF; Upper:#$FFFF; Lower:#$1FA7), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  4069. (Unicode:#$1FBC; Upper:#$FFFF; Lower:#$1FB3), // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
  4070. (Unicode:#$1FCC; Upper:#$FFFF; Lower:#$1FC3), // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
  4071. (Unicode:#$1FFC; Upper:#$FFFF; Lower:#$1FF3) // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
  4072. );
  4073. function UnicodeLocateTitleCaseLetterInfo(const Ch: WideChar): Integer;
  4074. var I : Integer;
  4075. begin
  4076. if (Ord(Ch) < $01C5) or (Ord(Ch) > $1FFC) then
  4077. Result := -1 else
  4078. if (Ord(Ch) > $01F2) and (Ord(Ch) < $1F88) then
  4079. Result := -1 else
  4080. begin
  4081. for I := 0 to UnicodeTitleCaseLetterEntries - 1 do
  4082. if UnicodeTitleCaseLetterInfo[I].Unicode = Ch then
  4083. begin
  4084. Result := I;
  4085. exit;
  4086. end;
  4087. Result := -1;
  4088. end;
  4089. end;
  4090. function UnicodeIsTitleCase(const Ch: WideChar): Boolean;
  4091. begin
  4092. Result := UnicodeLocateTitleCaseLetterInfo(Ch) >= 0;
  4093. end;
  4094. // Derived from 'Lo' class
  4095. function UnicodeIsOtherLetter(const Ch: UCS4Char): Boolean;
  4096. begin
  4097. case Ch of
  4098. $01BB, // LATIN LETTER TWO WITH STROKE
  4099. $01C0..$01C3, // [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
  4100. $05D0..$05EA, // [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
  4101. $05F0..$05F2, // [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
  4102. $0621..$063A, // [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN
  4103. $0641..$064A, // [10] ARABIC LETTER FEH..ARABIC LETTER YEH
  4104. $066E..$066F, // [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
  4105. $0671..$06D3, // [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
  4106. $06D5, // ARABIC LETTER AE
  4107. $06FA..$06FC, // [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
  4108. $0710, // SYRIAC LETTER ALAPH
  4109. $0712..$072C, // [27] SYRIAC LETTER BETH..SYRIAC LETTER TAW
  4110. $0780..$07A5, // [38] THAANA LETTER HAA..THAANA LETTER WAAVU
  4111. $07B1, // THAANA LETTER NAA
  4112. $0905..$0939, // [53] DEVANAGARI LETTER A..DEVANAGARI LETTER HA
  4113. $093D, // DEVANAGARI SIGN AVAGRAHA
  4114. $0950, // DEVANAGARI OM
  4115. $0958..$0961, // [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
  4116. $0985..$098C, // [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
  4117. $098F..$0990, // [2] BENGALI LETTER E..BENGALI LETTER AI
  4118. $0993..$09A8, // [22] BENGALI LETTER O..BENGALI LETTER NA
  4119. $09AA..$09B0, // [7] BENGALI LETTER PA..BENGALI LETTER RA
  4120. $09B2, // BENGALI LETTER LA
  4121. $09B6..$09B9, // [4] BENGALI LETTER SHA..BENGALI LETTER HA
  4122. $09DC..$09DD, // [2] BENGALI LETTER RRA..BENGALI LETTER RHA
  4123. $09DF..$09E1, // [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
  4124. $09F0..$09F1, // [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
  4125. $0A05..$0A0A, // [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
  4126. $0A0F..$0A10, // [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
  4127. $0A13..$0A28, // [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
  4128. $0A2A..$0A30, // [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
  4129. $0A32..$0A33, // [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
  4130. $0A35..$0A36, // [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
  4131. $0A38..$0A39, // [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
  4132. $0A59..$0A5C, // [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
  4133. $0A5E, // GURMUKHI LETTER FA
  4134. $0A72..$0A74, // [3] GURMUKHI IRI..GURMUKHI EK ONKAR
  4135. $0A85..$0A8B, // [7] GUJARATI LETTER A..GUJARATI LETTER VOCALIC R
  4136. $0A8D, // GUJARATI VOWEL CANDRA E
  4137. $0A8F..$0A91, // [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
  4138. $0A93..$0AA8, // [22] GUJARATI LETTER O..GUJARATI LETTER NA
  4139. $0AAA..$0AB0, // [7] GUJARATI LETTER PA..GUJARATI LETTER RA
  4140. $0AB2..$0AB3, // [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
  4141. $0AB5..$0AB9, // [5] GUJARATI LETTER VA..GUJARATI LETTER HA
  4142. $0ABD, // GUJARATI SIGN AVAGRAHA
  4143. $0AD0, // GUJARATI OM
  4144. $0AE0, // GUJARATI LETTER VOCALIC RR
  4145. $0B05..$0B0C, // [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
  4146. $0B0F..$0B10, // [2] ORIYA LETTER E..ORIYA LETTER AI
  4147. $0B13..$0B28, // [22] ORIYA LETTER O..ORIYA LETTER NA
  4148. $0B2A..$0B30, // [7] ORIYA LETTER PA..ORIYA LETTER RA
  4149. $0B32..$0B33, // [2] ORIYA LETTER LA..ORIYA LETTER LLA
  4150. $0B36..$0B39, // [4] ORIYA LETTER SHA..ORIYA LETTER HA
  4151. $0B3D, // ORIYA SIGN AVAGRAHA
  4152. $0B5C..$0B5D, // [2] ORIYA LETTER RRA..ORIYA LETTER RHA
  4153. $0B5F..$0B61, // [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
  4154. $0B83, // TAMIL SIGN VISARGA
  4155. $0B85..$0B8A, // [6] TAMIL LETTER A..TAMIL LETTER UU
  4156. $0B8E..$0B90, // [3] TAMIL LETTER E..TAMIL LETTER AI
  4157. $0B92..$0B95, // [4] TAMIL LETTER O..TAMIL LETTER KA
  4158. $0B99..$0B9A, // [2] TAMIL LETTER NGA..TAMIL LETTER CA
  4159. $0B9C, // TAMIL LETTER JA
  4160. $0B9E..$0B9F, // [2] TAMIL LETTER NYA..TAMIL LETTER TTA
  4161. $0BA3..$0BA4, // [2] TAMIL LETTER NNA..TAMIL LETTER TA
  4162. $0BA8..$0BAA, // [3] TAMIL LETTER NA..TAMIL LETTER PA
  4163. $0BAE..$0BB5, // [8] TAMIL LETTER MA..TAMIL LETTER VA
  4164. $0BB7..$0BB9, // [3] TAMIL LETTER SSA..TAMIL LETTER HA
  4165. $0C05..$0C0C, // [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
  4166. $0C0E..$0C10, // [3] TELUGU LETTER E..TELUGU LETTER AI
  4167. $0C12..$0C28, // [23] TELUGU LETTER O..TELUGU LETTER NA
  4168. $0C2A..$0C33, // [10] TELUGU LETTER PA..TELUGU LETTER LLA
  4169. $0C35..$0C39, // [5] TELUGU LETTER VA..TELUGU LETTER HA
  4170. $0C60..$0C61, // [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
  4171. $0C85..$0C8C, // [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
  4172. $0C8E..$0C90, // [3] KANNADA LETTER E..KANNADA LETTER AI
  4173. $0C92..$0CA8, // [23] KANNADA LETTER O..KANNADA LETTER NA
  4174. $0CAA..$0CB3, // [10] KANNADA LETTER PA..KANNADA LETTER LLA
  4175. $0CB5..$0CB9, // [5] KANNADA LETTER VA..KANNADA LETTER HA
  4176. $0CDE, // KANNADA LETTER FA
  4177. $0CE0..$0CE1, // [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
  4178. $0D05..$0D0C, // [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
  4179. $0D0E..$0D10, // [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
  4180. $0D12..$0D28, // [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
  4181. $0D2A..$0D39, // [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
  4182. $0D60..$0D61, // [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
  4183. $0D85..$0D96, // [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
  4184. $0D9A..$0DB1, // [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
  4185. $0DB3..$0DBB, // [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
  4186. $0DBD, // SINHALA LETTER DANTAJA LAYANNA
  4187. $0DC0..$0DC6, // [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
  4188. $0E01..$0E30, // [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
  4189. $0E32..$0E33, // [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
  4190. $0E40..$0E45, // [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
  4191. $0E81..$0E82, // [2] LAO LETTER KO..LAO LETTER KHO SUNG
  4192. $0E84, // LAO LETTER KHO TAM
  4193. $0E87..$0E88, // [2] LAO LETTER NGO..LAO LETTER CO
  4194. $0E8A, // LAO LETTER SO TAM
  4195. $0E8D, // LAO LETTER NYO
  4196. $0E94..$0E97, // [4] LAO LETTER DO..LAO LETTER THO TAM
  4197. $0E99..$0E9F, // [7] LAO LETTER NO..LAO LETTER FO SUNG
  4198. $0EA1..$0EA3, // [3] LAO LETTER MO..LAO LETTER LO LING
  4199. $0EA5, // LAO LETTER LO LOOT
  4200. $0EA7, // LAO LETTER WO
  4201. $0EAA..$0EAB, // [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
  4202. $0EAD..$0EB0, // [4] LAO LETTER O..LAO VOWEL SIGN A
  4203. $0EB2..$0EB3, // [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
  4204. $0EBD, // LAO SEMIVOWEL SIGN NYO
  4205. $0EC0..$0EC4, // [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
  4206. $0EDC..$0EDD, // [2] LAO HO NO..LAO HO MO
  4207. $0F00, // TIBETAN SYLLABLE OM
  4208. $0F40..$0F47, // [8] TIBETAN LETTER KA..TIBETAN LETTER JA
  4209. $0F49..$0F6A, // [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA
  4210. $0F88..$0F8B, // [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
  4211. $1000..$1021, // [34] MYANMAR LETTER KA..MYANMAR LETTER A
  4212. $1023..$1027, // [5] MYANMAR LETTER I..MYANMAR LETTER E
  4213. $1029..$102A, // [2] MYANMAR LETTER O..MYANMAR LETTER AU
  4214. $1050..$1055, // [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
  4215. $10D0..$10F8, // [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI
  4216. $1100..$1159, // [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
  4217. $115F..$11A2, // [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
  4218. $11A8..$11F9, // [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
  4219. $1200..$1206, // [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO
  4220. $1208..$1246, // [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO
  4221. $1248, // ETHIOPIC SYLLABLE QWA
  4222. $124A..$124D, // [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
  4223. $1250..$1256, // [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
  4224. $1258, // ETHIOPIC SYLLABLE QHWA
  4225. $125A..$125D, // [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
  4226. $1260..$1286, // [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO
  4227. $1288, // ETHIOPIC SYLLABLE XWA
  4228. $128A..$128D, // [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
  4229. $1290..$12AE, // [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO
  4230. $12B0, // ETHIOPIC SYLLABLE KWA
  4231. $12B2..$12B5, // [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
  4232. $12B8..$12BE, // [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
  4233. $12C0, // ETHIOPIC SYLLABLE KXWA
  4234. $12C2..$12C5, // [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
  4235. $12C8..$12CE, // [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO
  4236. $12D0..$12D6, // [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O
  4237. $12D8..$12EE, // [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO
  4238. $12F0..$130E, // [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO
  4239. $1310, // ETHIOPIC SYLLABLE GWA
  4240. $1312..$1315, // [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
  4241. $1318..$131E, // [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO
  4242. $1320..$1346, // [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO
  4243. $1348..$135A, // [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA
  4244. $13A0..$13F4, // [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
  4245. $1401..$166C, // [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
  4246. $166F..$1676, // [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA
  4247. $1681..$169A, // [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
  4248. $16A0..$16EA, // [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
  4249. $1700..$170C, // [13] TAGALOG LETTER A..TAGALOG LETTER YA
  4250. $170E..$1711, // [4] TAGALOG LETTER LA..TAGALOG LETTER HA
  4251. $1720..$1731, // [18] HANUNOO LETTER A..HANUNOO LETTER HA
  4252. $1740..$1751, // [18] BUHID LETTER A..BUHID LETTER HA
  4253. $1760..$176C, // [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
  4254. $176E..$1770, // [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
  4255. $1780..$17B3, // [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
  4256. $17DC, // KHMER SIGN AVAKRAHASANYA
  4257. $1820..$1842, // [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
  4258. $1844..$1877, // [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
  4259. $1880..$18A8, // [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
  4260. $2135..$2138, // [4] ALEF SYMBOL..DALET SYMBOL
  4261. $3006, // IDEOGRAPHIC CLOSING MARK
  4262. $303C, // MASU MARK
  4263. $3041..$3096, // [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
  4264. $309F, // HIRAGANA DIGRAPH YORI
  4265. $30A1..$30FA, // [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
  4266. $30FF, // KATAKANA DIGRAPH KOTO
  4267. $3105..$312C, // [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN
  4268. $3131..$318E, // [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
  4269. $31A0..$31B7, // [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
  4270. $31F0..$31FF, // [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
  4271. $3400..$4DB5, // [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
  4272. $4E00..$9FA5, // [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5
  4273. $A000..$A48C, // [1165] YI SYLLABLE IT..YI SYLLABLE YYR
  4274. $AC00..$D7A3, // [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
  4275. $F900..$FA2D, // [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
  4276. $FA30..$FA6A, // [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
  4277. $FB1D, // HEBREW LETTER YOD WITH HIRIQ
  4278. $FB1F..$FB28, // [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
  4279. $FB2A..$FB36, // [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
  4280. $FB38..$FB3C, // [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
  4281. $FB3E, // HEBREW LETTER MEM WITH DAGESH
  4282. $FB40..$FB41, // [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
  4283. $FB43..$FB44, // [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
  4284. $FB46..$FBB1, // [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
  4285. $FBD3..$FD3D, // [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
  4286. $FD50..$FD8F, // [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
  4287. $FD92..$FDC7, // [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
  4288. $FDF0..$FDFB, // [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
  4289. $FE70..$FE74, // [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
  4290. $FE76..$FEFC, // [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
  4291. $FF66..$FF6F, // [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
  4292. $FF71..$FF9D, // [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
  4293. $FFA0..$FFBE, // [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
  4294. $FFC2..$FFC7, // [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
  4295. $FFCA..$FFCF, // [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
  4296. $FFD2..$FFD7, // [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
  4297. $FFDA..$FFDC, // [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
  4298. $10300..$1031E, // [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
  4299. $10330..$10349, // [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL
  4300. $20000..$2A6D6, // [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
  4301. $2F800..$2FA1D : // [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
  4302. Result := True;
  4303. else
  4304. Result := False;
  4305. end;
  4306. end;
  4307. function UnicodeIsLetter(const Ch: WideChar): Boolean;
  4308. begin
  4309. if Ord(Ch) < $80 then // ASCII short-cut
  4310. Result := AnsiChar(Ord(Ch)) in ['A'..'Z', 'a'..'z']
  4311. else
  4312. begin
  4313. Result := UnicodeLocateLetterInfo(Ch) >= 0;
  4314. if Result then
  4315. exit;
  4316. Result := UnicodeLocateTitleCaseLetterInfo(Ch) >= 0;
  4317. if Result then
  4318. exit;
  4319. Result := UnicodeIsOtherLetter(Ord(Ch));
  4320. end;
  4321. end;
  4322. function UnicodeIsAlphabetic(const Ch: WideChar): Boolean;
  4323. begin
  4324. Result := UnicodeIsLetter(Ch);
  4325. if Result then
  4326. exit;
  4327. case Ord(Ch) of
  4328. $02B0..$02B8, // # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
  4329. $02BB..$02C1, // # Lm [7] MODIFIER LETTER TURNED COMMA..MODIFIER LETTER REVERSED GLOTTAL STOP
  4330. $02D0..$02D1, // # Lm [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON
  4331. $02E0..$02E4, // # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
  4332. $02EE, // # Lm MODIFIER LETTER DOUBLE APOSTROPHE
  4333. $0345, // # Mn COMBINING GREEK YPOGEGRAMMENI
  4334. $037A, // # Lm GREEK YPOGEGRAMMENI
  4335. $0559, // # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
  4336. $05B0..$05B9, // # Mn [10] HEBREW POINT SHEVA..HEBREW POINT HOLAM
  4337. $05BB..$05BD, // # Mn [3] HEBREW POINT QUBUTS..HEBREW POINT METEG
  4338. $05BF, // # Mn HEBREW POINT RAFE
  4339. $05C1..$05C2, // # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
  4340. $05C4, // # Mn HEBREW MARK UPPER DOT
  4341. $0640, // # Lm ARABIC TATWEEL
  4342. $064B..$0655, // # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW
  4343. $0670, // # Mn ARABIC LETTER SUPERSCRIPT ALEF
  4344. $06D6..$06DC, // # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
  4345. $06E1..$06E4, // # Mn [4] ARABIC SMALL HIGH DOTLESS HEAD OF KHAH..ARABIC SMALL HIGH MADDA
  4346. $06E5..$06E6, // # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH
  4347. $06E7..$06E8, // # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
  4348. $06ED, // # Mn ARABIC SMALL LOW MEEM
  4349. $0711, // # Mn SYRIAC LETTER SUPERSCRIPT ALAPH
  4350. $0730..$073F, // # Mn [16] SYRIAC PTHAHA ABOVE..SYRIAC RWAHA
  4351. $07A6..$07B0, // # Mn [11] THAANA ABAFILI..THAANA SUKUN
  4352. $0901..$0902, // # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
  4353. $0903, // # Mc DEVANAGARI SIGN VISARGA
  4354. $093E..$0940, // # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
  4355. $0941..$0948, // # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
  4356. $0949..$094C, // # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
  4357. $0962..$0963, // # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
  4358. $0981, // # Mn BENGALI SIGN CANDRABINDU
  4359. $0982..$0983, // # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
  4360. $09BE..$09C0, // # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
  4361. $09C1..$09C4, // # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
  4362. $09C7..$09C8, // # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
  4363. $09CB..$09CC, // # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
  4364. $09D7, // # Mc BENGALI AU LENGTH MARK
  4365. $09E2..$09E3, // # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
  4366. $0A02, // # Mn GURMUKHI SIGN BINDI
  4367. $0A3E..$0A40, // # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
  4368. $0A41..$0A42, // # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
  4369. $0A47..$0A48, // # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
  4370. $0A4B..$0A4C, // # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU
  4371. $0A70..$0A71, // # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
  4372. $0A81..$0A82, // # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
  4373. $0A83, // # Mc GUJARATI SIGN VISARGA
  4374. $0ABE..$0AC0, // # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
  4375. $0AC1..$0AC5, // # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
  4376. $0AC7..$0AC8, // # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
  4377. $0AC9, // # Mc GUJARATI VOWEL SIGN CANDRA O
  4378. $0ACB..$0ACC, // # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
  4379. $0B01, // # Mn ORIYA SIGN CANDRABINDU
  4380. $0B02..$0B03, // # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
  4381. $0B3E, // # Mc ORIYA VOWEL SIGN AA
  4382. $0B3F, // # Mn ORIYA VOWEL SIGN I
  4383. $0B40, // # Mc ORIYA VOWEL SIGN II
  4384. $0B41..$0B43, // # Mn [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R
  4385. $0B47..$0B48, // # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
  4386. $0B4B..$0B4C, // # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
  4387. $0B56, // # Mn ORIYA AI LENGTH MARK
  4388. $0B57, // # Mc ORIYA AU LENGTH MARK
  4389. $0B82, // # Mn TAMIL SIGN ANUSVARA
  4390. $0BBE..$0BBF, // # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
  4391. $0BC0, // # Mn TAMIL VOWEL SIGN II
  4392. $0BC1..$0BC2, // # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
  4393. $0BC6..$0BC8, // # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
  4394. $0BCA..$0BCC, // # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
  4395. $0BD7, // # Mc TAMIL AU LENGTH MARK
  4396. $0C01..$0C03, // # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
  4397. $0C3E..$0C40, // # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
  4398. $0C41..$0C44, // # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
  4399. $0C46..$0C48, // # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
  4400. $0C4A..$0C4C, // # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU
  4401. $0C55..$0C56, // # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
  4402. $0C82..$0C83, // # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
  4403. $0CBE, // # Mc KANNADA VOWEL SIGN AA
  4404. $0CBF, // # Mn KANNADA VOWEL SIGN I
  4405. $0CC0..$0CC4, // # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
  4406. $0CC6, // # Mn KANNADA VOWEL SIGN E
  4407. $0CC7..$0CC8, // # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
  4408. $0CCA..$0CCB, // # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
  4409. $0CCC, // # Mn KANNADA VOWEL SIGN AU
  4410. $0CD5..$0CD6, // # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
  4411. $0D02..$0D03, // # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
  4412. $0D3E..$0D40, // # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
  4413. $0D41..$0D43, // # Mn [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R
  4414. $0D46..$0D48, // # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
  4415. $0D4A..$0D4C, // # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
  4416. $0D57, // # Mc MALAYALAM AU LENGTH MARK
  4417. $0D82..$0D83, // # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
  4418. $0DCF..$0DD1, // # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
  4419. $0DD2..$0DD4, // # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
  4420. $0DD6, // # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA
  4421. $0DD8..$0DDF, // # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
  4422. $0DF2..$0DF3, // # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
  4423. $0E31, // # Mn THAI CHARACTER MAI HAN-AKAT
  4424. $0E34..$0E3A, // # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
  4425. $0E46, // # Lm THAI CHARACTER MAIYAMOK
  4426. $0E4D, // # Mn THAI CHARACTER NIKHAHIT
  4427. $0EB1, // # Mn LAO VOWEL SIGN MAI KAN
  4428. $0EB4..$0EB9, // # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
  4429. $0EBB..$0EBC, // # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
  4430. $0EC6, // # Lm LAO KO LA
  4431. $0ECD, // # Mn LAO NIGGAHITA
  4432. $0F71..$0F7E, // # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
  4433. $0F7F, // # Mc TIBETAN SIGN RNAM BCAD
  4434. $0F80..$0F81, // # Mn [2] TIBETAN VOWEL SIGN REVERSED I..TIBETAN VOWEL SIGN REVERSED II
  4435. $0F90..$0F97, // # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
  4436. $0F99..$0FBC, // # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
  4437. $102C, // # Mc MYANMAR VOWEL SIGN AA
  4438. $102D..$1030, // # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
  4439. $1031, // # Mc MYANMAR VOWEL SIGN E
  4440. $1032, // # Mn MYANMAR VOWEL SIGN AI
  4441. $1036, // # Mn MYANMAR SIGN ANUSVARA
  4442. $1038, // # Mc MYANMAR SIGN VISARGA
  4443. $1056..$1057, // # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
  4444. $1058..$1059, // # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
  4445. $16EE..$16F0, // # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
  4446. $1712..$1713, // # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U
  4447. $1732..$1733, // # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
  4448. $1752..$1753, // # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
  4449. $1772..$1773, // # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
  4450. $17B4..$17B6, // # Mc [3] KHMER VOWEL INHERENT AQ..KHMER VOWEL SIGN AA
  4451. $17B7..$17BD, // # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
  4452. $17BE..$17C5, // # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
  4453. $17C6, // # Mn KHMER SIGN NIKAHIT
  4454. $17C7..$17C8, // # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
  4455. $17D7, // # Lm KHMER SIGN LEK TOO
  4456. $1843, // # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
  4457. $18A9, // # Mn MONGOLIAN LETTER ALI GALI DAGALGA
  4458. $2160..$2183, // # Nl [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED
  4459. $3005, // # Lm IDEOGRAPHIC ITERATION MARK
  4460. $3007, // # Nl IDEOGRAPHIC NUMBER ZERO
  4461. $3021..$3029, // # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
  4462. $3031..$3035, // # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
  4463. $3038..$303A, // # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
  4464. $303B, // # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
  4465. $309D..$309E, // # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
  4466. $30FC..$30FE, // # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
  4467. $FB1E, // # Mn HEBREW POINT JUDEO-SPANISH VARIKA
  4468. $FF70, // # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
  4469. $FF9E..$FF9F : // # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
  4470. Result := True;
  4471. else
  4472. Result := False;
  4473. end;
  4474. end;
  4475. {$IFDEF ManagedCode}
  4476. function UnicodeUpCase(const Ch: WideChar): WideChar;
  4477. var I : Integer;
  4478. J : Integer;
  4479. C : WideChar;
  4480. P : TUnicodeLetterInfo;
  4481. begin
  4482. if Ord(Ch) < $80 then // ASCII short-cut
  4483. begin
  4484. if AnsiChar(Ord(Ch)) in ['a'..'z'] then
  4485. Result := WideChar(Ord(Ch) - (Ord('a') - Ord('A'))) else
  4486. Result := Ch;
  4487. end else
  4488. begin
  4489. I := UnicodeLocateLetterInfo(Ch);
  4490. if I >= 0 then
  4491. begin
  4492. P := UnicodeLetterInfo[I];
  4493. if P.Attr = laUpper then
  4494. Result := Ch else
  4495. begin
  4496. C := P.CaseCode;
  4497. if C = #$FFFF then
  4498. Result := Ch else
  4499. Result := C;
  4500. end;
  4501. end else
  4502. begin
  4503. J := UnicodeLocateTitleCaseLetterInfo(Ch);
  4504. if J >= 0 then
  4505. begin
  4506. C := UnicodeTitleCaseLetterInfo[J].Upper;
  4507. if C = #$FFFF then
  4508. Result := Ch else
  4509. Result := C;
  4510. end else
  4511. begin
  4512. C := UnicodeLocateOtherLowerCase(Ch);
  4513. if C = #$0000 then
  4514. Result := Ch else
  4515. Result := C;
  4516. end;
  4517. end;
  4518. end;
  4519. end;
  4520. {$ELSE}
  4521. function UnicodeUpCase(const Ch: WideChar): WideChar;
  4522. var I : Integer;
  4523. J : Integer;
  4524. C : WideChar;
  4525. P : PUnicodeLetterInfo;
  4526. begin
  4527. if Ord(Ch) < $80 then // ASCII short-cut
  4528. begin
  4529. if AnsiChar(Ord(Ch)) in ['a'..'z'] then
  4530. Result := WideChar(Ord(Ch) - (Ord('a') - Ord('A'))) else
  4531. Result := Ch;
  4532. end else
  4533. begin
  4534. I := UnicodeLocateLetterInfo(Ch);
  4535. if I >= 0 then
  4536. begin
  4537. P := @UnicodeLetterInfo[I];
  4538. if P^.Attr = laUpper then
  4539. Result := Ch else
  4540. begin
  4541. C := P^.CaseCode;
  4542. if C = #$FFFF then
  4543. Result := Ch else
  4544. Result := C;
  4545. end;
  4546. end else
  4547. begin
  4548. J := UnicodeLocateTitleCaseLetterInfo(Ch);
  4549. if J >= 0 then
  4550. begin
  4551. C := UnicodeTitleCaseLetterInfo[J].Upper;
  4552. if C = #$FFFF then
  4553. Result := Ch else
  4554. Result := C;
  4555. end else
  4556. begin
  4557. C := UnicodeLocateOtherLowerCase(Ch);
  4558. if C = #$0000 then
  4559. Result := Ch else
  4560. Result := C;
  4561. end;
  4562. end;
  4563. end;
  4564. end;
  4565. {$ENDIF}
  4566. {$IFDEF ManagedCode}
  4567. function UnicodeLowCase(const Ch: WideChar): WideChar;
  4568. var I : Integer;
  4569. J : Integer;
  4570. C : WideChar;
  4571. P : TUnicodeLetterInfo;
  4572. begin
  4573. if Ord(Ch) < $80 then // ASCII short-cut
  4574. begin
  4575. if AnsiChar(Ord(Ch)) in ['A'..'Z'] then
  4576. Result := WideChar(Ord(Ch) + (Ord('a') - Ord('A'))) else
  4577. Result := Ch;
  4578. end else
  4579. begin
  4580. I := UnicodeLocateLetterInfo(Ch);
  4581. if I >= 0 then
  4582. begin
  4583. P := UnicodeLetterInfo[I];
  4584. if P.Attr = laLower then
  4585. Result := Ch else
  4586. begin
  4587. C := P.CaseCode;
  4588. if C = #$FFFF then
  4589. Result := Ch else
  4590. Result := C;
  4591. end;
  4592. end else
  4593. begin
  4594. J := UnicodeLocateTitleCaseLetterInfo(Ch);
  4595. if J >= 0 then
  4596. begin
  4597. C := UnicodeTitleCaseLetterInfo[J].Lower;
  4598. if C = #$FFFF then
  4599. Result := Ch else
  4600. Result := C;
  4601. end else
  4602. begin
  4603. C := UnicodeLocateOtherUpperCase(Ch);
  4604. if C = #$0000 then
  4605. Result := Ch else
  4606. Result := C;
  4607. end;
  4608. end;
  4609. end;
  4610. end;
  4611. {$ELSE}
  4612. function UnicodeLowCase(const Ch: WideChar): WideChar;
  4613. var I : Integer;
  4614. J : Integer;
  4615. C : WideChar;
  4616. P : PUnicodeLetterInfo;
  4617. begin
  4618. if Ord(Ch) < $80 then // ASCII short-cut
  4619. begin
  4620. if AnsiChar(Ord(Ch)) in ['A'..'Z'] then
  4621. Result := WideChar(Ord(Ch) + (Ord('a') - Ord('A'))) else
  4622. Result := Ch;
  4623. end else
  4624. begin
  4625. I := UnicodeLocateLetterInfo(Ch);
  4626. if I >= 0 then
  4627. begin
  4628. P := @UnicodeLetterInfo[I];
  4629. if P^.Attr = laLower then
  4630. Result := Ch else
  4631. begin
  4632. C := P^.CaseCode;
  4633. if C = #$FFFF then
  4634. Result := Ch else
  4635. Result := C;
  4636. end;
  4637. end else
  4638. begin
  4639. J := UnicodeLocateTitleCaseLetterInfo(Ch);
  4640. if J >= 0 then
  4641. begin
  4642. C := UnicodeTitleCaseLetterInfo[J].Lower;
  4643. if C = #$FFFF then
  4644. Result := Ch else
  4645. Result := C;
  4646. end else
  4647. begin
  4648. C := UnicodeLocateOtherUpperCase(Ch);
  4649. if C = #$0000 then
  4650. Result := Ch else
  4651. Result := C;
  4652. end;
  4653. end;
  4654. end;
  4655. end;
  4656. {$ENDIF}
  4657. function UnicodeLocateFoldingUpperCase(const Ch: WideChar): WideString;
  4658. begin
  4659. if Ord(Ch) < $00DF then
  4660. Result := '' else
  4661. if Ord(Ch) <= $0587 then
  4662. case Ord(Ch) of
  4663. $00DF : Result := #$0053#$0053; // # LATIN SMALL LETTER SHARP S
  4664. $0149 : Result := #$02BC#$004E; // # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
  4665. $01F0 : Result := #$004A#$030C; // # LATIN SMALL LETTER J WITH CARON
  4666. $0390 : Result := #$0399#$0308#$0301; // # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
  4667. $03B0 : Result := #$03A5#$0308#$0301; // # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
  4668. $0587 : Result := #$0535#$0552; // # ARMENIAN SMALL LIGATURE ECH YIWN
  4669. else
  4670. Result := '';
  4671. end else
  4672. if Ord(Ch) < $1E96 then
  4673. Result := '' else
  4674. if Ord(Ch) <= $1FFC then
  4675. case Ord(Ch) of
  4676. $1E96 : Result := #$0048#$0331; // # LATIN SMALL LETTER H WITH LINE BELOW
  4677. $1E97 : Result := #$0054#$0308; // # LATIN SMALL LETTER T WITH DIAERESIS
  4678. $1E98 : Result := #$0057#$030A; // # LATIN SMALL LETTER W WITH RING ABOVE
  4679. $1E99 : Result := #$0059#$030A; // # LATIN SMALL LETTER Y WITH RING ABOVE
  4680. $1E9A : Result := #$0041#$02BE; // # LATIN SMALL LETTER A WITH RIGHT HALF RING
  4681. $1F50 : Result := #$03A5#$0313; // # GREEK SMALL LETTER UPSILON WITH PSILI
  4682. $1F52 : Result := #$03A5#$0313#$0300; // # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
  4683. $1F54 : Result := #$03A5#$0313#$0301; // # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
  4684. $1F56 : Result := #$03A5#$0313#$0342; // # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
  4685. $1F80 : Result := #$1F08#$0399; // # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
  4686. $1F81 : Result := #$1F09#$0399; // # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
  4687. $1F82 : Result := #$1F0A#$0399; // # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  4688. $1F83 : Result := #$1F0B#$0399; // # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  4689. $1F84 : Result := #$1F0C#$0399; // # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  4690. $1F85 : Result := #$1F0D#$0399; // # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  4691. $1F86 : Result := #$1F0E#$0399; // # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  4692. $1F87 : Result := #$1F0F#$0399; // # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  4693. $1F88 : Result := #$1F08#$0399; // # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
  4694. $1F89 : Result := #$1F09#$0399; // # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
  4695. $1F8A : Result := #$1F0A#$0399; // # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  4696. $1F8B : Result := #$1F0B#$0399; // # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  4697. $1F8C : Result := #$1F0C#$0399; // # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  4698. $1F8D : Result := #$1F0D#$0399; // # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  4699. $1F8E : Result := #$1F0E#$0399; // # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  4700. $1F8F : Result := #$1F0F#$0399; // # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  4701. $1F90 : Result := #$1F28#$0399; // # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
  4702. $1F91 : Result := #$1F29#$0399; // # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
  4703. $1F92 : Result := #$1F2A#$0399; // # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  4704. $1F93 : Result := #$1F2B#$0399; // # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  4705. $1F94 : Result := #$1F2C#$0399; // # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  4706. $1F95 : Result := #$1F2D#$0399; // # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  4707. $1F96 : Result := #$1F2E#$0399; // # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  4708. $1F97 : Result := #$1F2F#$0399; // # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  4709. $1F98 : Result := #$1F28#$0399; // # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
  4710. $1F99 : Result := #$1F29#$0399; // # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
  4711. $1F9A : Result := #$1F2A#$0399; // # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  4712. $1F9B : Result := #$1F2B#$0399; // # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  4713. $1F9C : Result := #$1F2C#$0399; // # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  4714. $1F9D : Result := #$1F2D#$0399; // # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  4715. $1F9E : Result := #$1F2E#$0399; // # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  4716. $1F9F : Result := #$1F2F#$0399; // # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  4717. $1FA0 : Result := #$1F68#$0399; // # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
  4718. $1FA1 : Result := #$1F69#$0399; // # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
  4719. $1FA2 : Result := #$1F6A#$0399; // # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  4720. $1FA3 : Result := #$1F6B#$0399; // # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  4721. $1FA4 : Result := #$1F6C#$0399; // # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  4722. $1FA5 : Result := #$1F6D#$0399; // # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  4723. $1FA6 : Result := #$1F6E#$0399; // # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  4724. $1FA7 : Result := #$1F6F#$0399; // # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  4725. $1FA8 : Result := #$1F68#$0399; // # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
  4726. $1FA9 : Result := #$1F69#$0399; // # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
  4727. $1FAA : Result := #$1F6A#$0399; // # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  4728. $1FAB : Result := #$1F6B#$0399; // # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  4729. $1FAC : Result := #$1F6C#$0399; // # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  4730. $1FAD : Result := #$1F6D#$0399; // # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  4731. $1FAE : Result := #$1F6E#$0399; // # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  4732. $1FAF : Result := #$1F6F#$0399; // # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  4733. $1FB2 : Result := #$1FBA#$0399; // # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
  4734. $1FB3 : Result := #$0391#$0399; // # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
  4735. $1FB4 : Result := #$0386#$0399; // # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
  4736. $1FB6 : Result := #$0391#$0342; // # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
  4737. $1FB7 : Result := #$0391#$0342#$0399; // # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
  4738. $1FBC : Result := #$0391#$0399; // # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
  4739. $1FC2 : Result := #$1FCA#$0399; // # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
  4740. $1FC3 : Result := #$0397#$0399; // # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
  4741. $1FC4 : Result := #$0389#$0399; // # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
  4742. $1FC6 : Result := #$0397#$0342; // # GREEK SMALL LETTER ETA WITH PERISPOMENI
  4743. $1FC7 : Result := #$0397#$0342#$0399; // # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
  4744. $1FCC : Result := #$0397#$0399; // # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
  4745. $1FD2 : Result := #$0399#$0308#$0300; // # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
  4746. $1FD3 : Result := #$0399#$0308#$0301; // # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
  4747. $1FD6 : Result := #$0399#$0342; // # GREEK SMALL LETTER IOTA WITH PERISPOMENI
  4748. $1FD7 : Result := #$0399#$0308#$0342; // # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
  4749. $1FE2 : Result := #$03A5#$0308#$0300; // # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
  4750. $1FE3 : Result := #$03A5#$0308#$0301; // # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
  4751. $1FE4 : Result := #$03A1#$0313; // # GREEK SMALL LETTER RHO WITH PSILI
  4752. $1FE6 : Result := #$03A5#$0342; // # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
  4753. $1FE7 : Result := #$03A5#$0308#$0342; // # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
  4754. $1FF2 : Result := #$1FFA#$0399; // # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
  4755. $1FF3 : Result := #$03A9#$0399; // # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
  4756. $1FF4 : Result := #$038F#$0399; // # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
  4757. $1FF6 : Result := #$03A9#$0342; // # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
  4758. $1FF7 : Result := #$03A9#$0342#$0399; // # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
  4759. $1FFC : Result := #$03A9#$0399; // # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
  4760. else
  4761. Result := '';
  4762. end else
  4763. if Ord(Ch) < $FB00 then
  4764. Result := '' else
  4765. if Ord(Ch) <= $FB17 then
  4766. case Ord(Ch) of
  4767. $FB00 : Result := #$0046#$0046; // # LATIN SMALL LIGATURE FF
  4768. $FB01 : Result := #$0046#$0049; // # LATIN SMALL LIGATURE FI
  4769. $FB02 : Result := #$0046#$004C; // # LATIN SMALL LIGATURE FL
  4770. $FB03 : Result := #$0046#$0046#$0049; // # LATIN SMALL LIGATURE FFI
  4771. $FB04 : Result := #$0046#$0046#$004C; // # LATIN SMALL LIGATURE FFL
  4772. $FB05 : Result := #$0053#$0054; // # LATIN SMALL LIGATURE LONG S T
  4773. $FB06 : Result := #$0053#$0054; // # LATIN SMALL LIGATURE ST
  4774. $FB13 : Result := #$0544#$0546; // # ARMENIAN SMALL LIGATURE MEN NOW
  4775. $FB14 : Result := #$0544#$0535; // # ARMENIAN SMALL LIGATURE MEN ECH
  4776. $FB15 : Result := #$0544#$053B; // # ARMENIAN SMALL LIGATURE MEN INI
  4777. $FB16 : Result := #$054E#$0546; // # ARMENIAN SMALL LIGATURE VEW NOW
  4778. $FB17 : Result := #$0544#$053D; // # ARMENIAN SMALL LIGATURE MEN XEH
  4779. else
  4780. Result := '';
  4781. end
  4782. else
  4783. Result := '';
  4784. end;
  4785. function UnicodeUpCaseFoldingW(const Ch: WideChar): WideString;
  4786. var R : WideChar;
  4787. begin
  4788. R := UnicodeUpCase(Ch);
  4789. if R = Ch then
  4790. begin
  4791. Result := UnicodeLocateFoldingUpperCase(Ch);
  4792. if Result = '' then
  4793. Result := Ch;
  4794. end
  4795. else
  4796. Result := R;
  4797. end;
  4798. function UnicodeUpCaseFoldingU(const Ch: WideChar): UnicodeString;
  4799. var R : WideChar;
  4800. begin
  4801. R := UnicodeUpCase(Ch);
  4802. if R = Ch then
  4803. begin
  4804. Result := UnicodeLocateFoldingUpperCase(Ch);
  4805. if Result = '' then
  4806. Result := Ch;
  4807. end
  4808. else
  4809. Result := R;
  4810. end;
  4811. function UnicodeLocateFoldingLowerCase(const Ch: WideChar): WideString;
  4812. begin
  4813. if Ch = #$0130 then
  4814. Result := #$0069#$0307
  4815. else
  4816. Result := '';
  4817. end;
  4818. function UnicodeLowCaseFoldingW(const Ch: WideChar): WideString;
  4819. var R : WideChar;
  4820. begin
  4821. R := UnicodeLowCase(Ch);
  4822. if R = Ch then
  4823. begin
  4824. Result := UnicodeLocateFoldingLowerCase(Ch);
  4825. if Result = '' then
  4826. Result := Ch;
  4827. end
  4828. else
  4829. Result := R;
  4830. end;
  4831. function UnicodeLowCaseFoldingU(const Ch: WideChar): UnicodeString;
  4832. var R : WideChar;
  4833. begin
  4834. R := UnicodeLowCase(Ch);
  4835. if R = Ch then
  4836. begin
  4837. Result := UnicodeLocateFoldingLowerCase(Ch);
  4838. if Result = '' then
  4839. Result := Ch;
  4840. end
  4841. else
  4842. Result := R;
  4843. end;
  4844. function UnicodeLocateFoldingTitleCase(const Ch: WideChar): WideString;
  4845. begin
  4846. if Ord(Ch) < $00DF then
  4847. Result := '' else
  4848. if Ord(Ch) <= $0587 then
  4849. case Ord(Ch) of
  4850. $00DF : Result := #$0053#$0073; // # LATIN SMALL LETTER SHARP S
  4851. $0149 : Result := #$02BC#$004E; // # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
  4852. $01F0 : Result := #$004A#$030C; // # LATIN SMALL LETTER J WITH CARON
  4853. $0390 : Result := #$0399#$0308#$0301; // # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
  4854. $03B0 : Result := #$03A5#$0308#$0301; // # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
  4855. $0587 : Result := #$0535#$0582; // # ARMENIAN SMALL LIGATURE ECH YIWN
  4856. else
  4857. Result := '';
  4858. end else
  4859. if Ord(Ch) < $1E96 then
  4860. Result := '' else
  4861. if Ord(Ch) <= $1FF7 then
  4862. case Ord(Ch) of
  4863. $1E96 : Result := #$0048#$0331; // # LATIN SMALL LETTER H WITH LINE BELOW
  4864. $1E97 : Result := #$0054#$0308; // # LATIN SMALL LETTER T WITH DIAERESIS
  4865. $1E98 : Result := #$0057#$030A; // # LATIN SMALL LETTER W WITH RING ABOVE
  4866. $1E99 : Result := #$0059#$030A; // # LATIN SMALL LETTER Y WITH RING ABOVE
  4867. $1E9A : Result := #$0041#$02BE; // # LATIN SMALL LETTER A WITH RIGHT HALF RING
  4868. $1F50 : Result := #$03A5#$0313; // # GREEK SMALL LETTER UPSILON WITH PSILI
  4869. $1F52 : Result := #$03A5#$0313#$0300; // # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
  4870. $1F54 : Result := #$03A5#$0313#$0301; // # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
  4871. $1F56 : Result := #$03A5#$0313#$0342; // # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
  4872. $1FB2 : Result := #$1FBA#$0345; // # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
  4873. $1FB4 : Result := #$0386#$0345; // # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
  4874. $1FB6 : Result := #$0391#$0342; // # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
  4875. $1FB7 : Result := #$0391#$0342#$0345; // # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
  4876. $1FC2 : Result := #$1FCA#$0345; // # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
  4877. $1FC4 : Result := #$0389#$0345; // # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
  4878. $1FC6 : Result := #$0397#$0342; // # GREEK SMALL LETTER ETA WITH PERISPOMENI
  4879. $1FC7 : Result := #$0397#$0342#$0345; // # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
  4880. $1FD2 : Result := #$0399#$0308#$0300; // # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
  4881. $1FD3 : Result := #$0399#$0308#$0301; // # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
  4882. $1FD6 : Result := #$0399#$0342; // # GREEK SMALL LETTER IOTA WITH PERISPOMENI
  4883. $1FD7 : Result := #$0399#$0308#$0342; // # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
  4884. $1FE2 : Result := #$03A5#$0308#$0300; // # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
  4885. $1FE3 : Result := #$03A5#$0308#$0301; // # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
  4886. $1FE4 : Result := #$03A1#$0313; // # GREEK SMALL LETTER RHO WITH PSILI
  4887. $1FE6 : Result := #$03A5#$0342; // # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
  4888. $1FE7 : Result := #$03A5#$0308#$0342; // # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
  4889. $1FF2 : Result := #$1FFA#$0345; // # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
  4890. $1FF4 : Result := #$038F#$0345; // # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
  4891. $1FF6 : Result := #$03A9#$0342; // # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
  4892. $1FF7 : Result := #$03A9#$0342#$0345; // # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
  4893. else
  4894. Result := '';
  4895. end else
  4896. if Ord(Ch) < $FB00 then
  4897. Result := '' else
  4898. if Ord(Ch) <= $FB17 then
  4899. case Ord(Ch) of
  4900. $FB00 : Result := #$0046#$0066; // # LATIN SMALL LIGATURE FF
  4901. $FB01 : Result := #$0046#$0069; // # LATIN SMALL LIGATURE FI
  4902. $FB02 : Result := #$0046#$006C; // # LATIN SMALL LIGATURE FL
  4903. $FB03 : Result := #$0046#$0066#$0069; // # LATIN SMALL LIGATURE FFI
  4904. $FB04 : Result := #$0046#$0066#$006C; // # LATIN SMALL LIGATURE FFL
  4905. $FB05 : Result := #$0053#$0074; // # LATIN SMALL LIGATURE LONG S T
  4906. $FB06 : Result := #$0053#$0074; // # LATIN SMALL LIGATURE ST
  4907. $FB13 : Result := #$0544#$0576; // # ARMENIAN SMALL LIGATURE MEN NOW
  4908. $FB14 : Result := #$0544#$0565; // # ARMENIAN SMALL LIGATURE MEN ECH
  4909. $FB15 : Result := #$0544#$056B; // # ARMENIAN SMALL LIGATURE MEN INI
  4910. $FB16 : Result := #$054E#$0576; // # ARMENIAN SMALL LIGATURE VEW NOW
  4911. $FB17 : Result := #$0544#$056D; // # ARMENIAN SMALL LIGATURE MEN XEH
  4912. else
  4913. Result := '';
  4914. end
  4915. else
  4916. Result := '';
  4917. end;
  4918. function UnicodeTitleCaseFoldingW(const Ch: WideChar): WideString;
  4919. begin
  4920. Result := UnicodeLocateFoldingTitleCase(Ch);
  4921. if Result = '' then
  4922. Result := Ch;
  4923. end;
  4924. function UnicodeTitleCaseFoldingU(const Ch: WideChar): UnicodeString;
  4925. begin
  4926. Result := UnicodeLocateFoldingTitleCase(Ch);
  4927. if Result = '' then
  4928. Result := Ch;
  4929. end;
  4930. {$IFDEF CLR}
  4931. function UnicodeCharIsEqualNoCase(const A, B: WideChar): Boolean;
  4932. var I : Integer;
  4933. J : Integer;
  4934. C, D : AnsiChar;
  4935. E, F : WideChar;
  4936. P : TUnicodeTitleCaseLetterInfo;
  4937. begin
  4938. Result := A = B;
  4939. if Result then
  4940. exit;
  4941. if (Ord(A) < $80) and (Ord(B) < $80) then // ASCII short-cut
  4942. begin
  4943. if AnsiChar(Ord(A)) in ['A'..'Z'] then
  4944. C := AnsiChar(Byte(Ord(A)) + (Ord('a') - Ord('A'))) else
  4945. C := AnsiChar(Ord(A));
  4946. if AnsiChar(Ord(B)) in ['A'..'Z'] then
  4947. D := AnsiChar(Byte (Ord(B)) + (Ord('a') - Ord('A'))) else
  4948. D := AnsiChar(Ord(B));
  4949. Result := C = D;
  4950. exit;
  4951. end;
  4952. I := UnicodeLocateLetterInfo(A);
  4953. if I >= 0 then
  4954. begin
  4955. E := UnicodeLetterInfo[I].CaseCode;
  4956. if E = #$FFFF then
  4957. Result := False else
  4958. Result := E = B;
  4959. exit;
  4960. end;
  4961. J := UnicodeLocateTitleCaseLetterInfo(A);
  4962. if J >= 0 then
  4963. begin
  4964. P := UnicodeTitleCaseLetterInfo[J];
  4965. E := P.Upper;
  4966. F := P.Lower;
  4967. Result := ((E <> #$FFFF) and (E = B)) or
  4968. ((F <> #$FFFF) and (F = B));
  4969. exit;
  4970. end;
  4971. E := UnicodeUnicodeLocateOtherLowerCase(A);
  4972. if E <> #$0000 then
  4973. Result := E = B
  4974. else
  4975. Result := False;
  4976. end;
  4977. {$ELSE}
  4978. function UnicodeCharIsEqualNoCase(const A, B: WideChar): Boolean;
  4979. var I : Integer;
  4980. J : Integer;
  4981. C, D : AnsiChar;
  4982. E, F : WideChar;
  4983. P : PUnicodeTitleCaseLetterInfo;
  4984. begin
  4985. Result := A = B;
  4986. if Result then
  4987. exit;
  4988. if (Ord(A) < $80) and (Ord(B) < $80) then // ASCII short-cut
  4989. begin
  4990. if AnsiChar(Ord(A)) in ['A'..'Z'] then
  4991. C := AnsiChar(Byte(Ord(A)) + (Ord('a') - Ord('A'))) else
  4992. C := AnsiChar(Ord(A));
  4993. if AnsiChar(Ord(B)) in ['A'..'Z'] then
  4994. D := AnsiChar(Byte (Ord(B)) + (Ord('a') - Ord('A'))) else
  4995. D := AnsiChar(Ord(B));
  4996. Result := C = D;
  4997. exit;
  4998. end;
  4999. I := UnicodeLocateLetterInfo(A);
  5000. if I >= 0 then
  5001. begin
  5002. E := UnicodeLetterInfo[I].CaseCode;
  5003. if E = #$FFFF then
  5004. Result := False else
  5005. Result := E = B;
  5006. exit;
  5007. end;
  5008. J := UnicodeLocateTitleCaseLetterInfo(A);
  5009. if J >= 0 then
  5010. begin
  5011. P := @UnicodeTitleCaseLetterInfo[J];
  5012. E := P^.Upper;
  5013. F := P^.Lower;
  5014. Result := ((E <> #$FFFF) and (E = B)) or
  5015. ((F <> #$FFFF) and (F = B));
  5016. exit;
  5017. end;
  5018. E := UnicodeLocateOtherLowerCase(A);
  5019. if E <> #$0000 then
  5020. Result := E = B
  5021. else
  5022. Result := False;
  5023. end;
  5024. {$ENDIF}
  5025. function UnicodeGetCombiningClass(const Ch: WideChar): Byte;
  5026. begin
  5027. if Ord(Ch) < $0300 then
  5028. Result := 0 else
  5029. case Ord(Ch) of
  5030. $0300..$0319 : Result := 230;
  5031. $031A : Result := 232;
  5032. $031B : Result := 216;
  5033. $031C..$0320 : Result := 220;
  5034. $0321..$0322 : Result := 202;
  5035. $0323..$0326 : Result := 220;
  5036. $0327..$0328 : Result := 202;
  5037. $0329..$0333 : Result := 220;
  5038. $0334..$0338 : Result := 1;
  5039. $0339..$033C : Result := 220;
  5040. $033D..$0344 : Result := 230;
  5041. $0345 : Result := 240;
  5042. $0346 : Result := 230;
  5043. $0347..$0349 : Result := 220;
  5044. $034A..$034C : Result := 230;
  5045. $034D..$034E : Result := 220;
  5046. $0360..$0361 : Result := 234;
  5047. $0362 : Result := 233;
  5048. $0483..$0486 : Result := 230;
  5049. $0591 : Result := 220;
  5050. $0592..$0595 : Result := 230;
  5051. $0596 : Result := 220;
  5052. $0597..$0599 : Result := 230;
  5053. $059A : Result := 222;
  5054. $059B : Result := 220;
  5055. $059C..$05A1 : Result := 230;
  5056. $05A3..$05A4 : Result := 220;
  5057. $05A8..$05A9 : Result := 230;
  5058. $05AA : Result := 220;
  5059. $05AB..$05AC : Result := 230;
  5060. $05AD : Result := 222;
  5061. $05AE : Result := 228;
  5062. $05AF : Result := 230;
  5063. $05B0..$05B9 : Result := Ord(Ch) - $05B0 + 10;
  5064. $05BB : Result := 20;
  5065. $05BC : Result := 21;
  5066. $05BD : Result := 22;
  5067. $05BF : Result := 23;
  5068. $05C1 : Result := 24;
  5069. $05C2 : Result := 25;
  5070. $05C4 : Result := 230;
  5071. $064B..$0652 : Result := Ord(Ch) - $064B + 27;
  5072. $0653..$0654 : Result := 230;
  5073. $0655 : Result := 220;
  5074. $0670 : Result := 35;
  5075. $06D6..$06DC : Result := 230;
  5076. $06DF..$06E2 : Result := 230;
  5077. $06E3 : Result := 220;
  5078. $06E4 : Result := 230;
  5079. $06E7..$06E8 : Result := 230;
  5080. $06EA : Result := 220;
  5081. $06EB..$06EC : Result := 230;
  5082. $06ED : Result := 220;
  5083. $0711 : Result := 36;
  5084. $0730 : Result := 230;
  5085. $0731 : Result := 220;
  5086. $0732..$0733 : Result := 230;
  5087. $0734 : Result := 220;
  5088. $0735..$0736 : Result := 230;
  5089. $0737..$0739 : Result := 220;
  5090. $073A : Result := 230;
  5091. $073B..$073C : Result := 220;
  5092. $073D : Result := 230;
  5093. $073E : Result := 220;
  5094. $073F..$0741 : Result := 230;
  5095. $0742 : Result := 220;
  5096. $0743 : Result := 230;
  5097. $0744 : Result := 220;
  5098. $0745 : Result := 230;
  5099. $0746 : Result := 220;
  5100. $0747 : Result := 230;
  5101. $0748 : Result := 220;
  5102. $0749..$074A : Result := 230;
  5103. $093C : Result := 7;
  5104. $094D : Result := 9;
  5105. $0951 : Result := 230;
  5106. $0952 : Result := 220;
  5107. $0953..$0954 : Result := 230;
  5108. $09BC : Result := 7;
  5109. $09CD : Result := 9;
  5110. $0A3C : Result := 7;
  5111. $0A4D : Result := 9;
  5112. $0ABC : Result := 7;
  5113. $0ACD : Result := 9;
  5114. $0B3C : Result := 7;
  5115. $0B4D : Result := 9;
  5116. $0BCD : Result := 9;
  5117. $0C4D : Result := 9;
  5118. $0C55 : Result := 84;
  5119. $0C56 : Result := 91;
  5120. $0CCD : Result := 9;
  5121. $0D4D : Result := 9;
  5122. $0DCA : Result := 9;
  5123. $0E38..$0E39 : Result := 103;
  5124. $0E3A : Result := 9;
  5125. $0E48..$0E4B : Result := 107;
  5126. $0EB8..$0EB9 : Result := 118;
  5127. $0EC8..$0ECB : Result := 122;
  5128. $0F18..$0F19 : Result := 220;
  5129. $0F35 : Result := 220;
  5130. $0F37 : Result := 220;
  5131. $0F39 : Result := 216;
  5132. $0F71 : Result := 129;
  5133. $0F72 : Result := 130;
  5134. $0F74 : Result := 132;
  5135. $0F7A..$0F7D : Result := 130;
  5136. $0F80 : Result := 130;
  5137. $0F82..$0F83 : Result := 230;
  5138. $0F84 : Result := 9;
  5139. $0F86..$0F87 : Result := 230;
  5140. $0FC6 : Result := 220;
  5141. $1037 : Result := 7;
  5142. $1039 : Result := 9;
  5143. $17D2 : Result := 9;
  5144. $18A9 : Result := 228;
  5145. $20D0..$20D1 : Result := 230;
  5146. $20D2..$20D3 : Result := 1;
  5147. $20D4..$20D7 : Result := 230;
  5148. $20D8..$20DA : Result := 1;
  5149. $20DB..$20DC : Result := 230;
  5150. $20E1 : Result := 230;
  5151. $302A : Result := 218;
  5152. $302B : Result := 228;
  5153. $302C : Result := 232;
  5154. $302D : Result := 222;
  5155. $302E..$302F : Result := 224;
  5156. $3099 : Result := 8;
  5157. $309A : Result := 8;
  5158. $FB1E : Result := 26;
  5159. $FE20..$FE23 : Result := 230;
  5160. else
  5161. Result := 0;
  5162. end;
  5163. end;
  5164. type
  5165. TUnicodeDecompositionAttr = (daNone, daNoBreak, daCompat, daSuper,
  5166. daFraction, daSub, daFont, daCircle, daWide, daSquare, daIsolated,
  5167. daInitial, daFinal, daMedial, daVertical, daSmall, daNarrow);
  5168. TUnicodeDecompositionInfo = packed record
  5169. Unicode : WideChar;
  5170. Attr : TUnicodeDecompositionAttr;
  5171. Ch1 : WideChar;
  5172. Ch2 : WideChar;
  5173. Ch3 : WideChar;
  5174. Ch4 : WideChar;
  5175. Ch5 : WideChar;
  5176. end;
  5177. PUnicodeDecompositionInfo = ^TUnicodeDecompositionInfo;
  5178. const
  5179. UnicodeDecompositionEntries = 3481; // ~ 45K
  5180. UnicodeDecompositionInfo : Array[0..UnicodeDecompositionEntries - 1] of TUnicodeDecompositionInfo = (
  5181. (Unicode:#$00A0; Attr:daNoBreak; Ch1:#$0020; Ch2:#$FFFF), // NO-BREAK SPACE
  5182. (Unicode:#$00A8; Attr:daCompat; Ch1:#$0020; Ch2:#$0308; Ch3:#$FFFF), // DIAERESIS
  5183. (Unicode:#$00AA; Attr:daSuper; Ch1:#$0061; Ch2:#$FFFF), // FEMININE ORDINAL INDICATOR
  5184. (Unicode:#$00AF; Attr:daCompat; Ch1:#$0020; Ch2:#$0304; Ch3:#$FFFF), // MACRON
  5185. (Unicode:#$00B2; Attr:daSuper; Ch1:#$0032; Ch2:#$FFFF), // SUPERSCRIPT TWO
  5186. (Unicode:#$00B3; Attr:daSuper; Ch1:#$0033; Ch2:#$FFFF), // SUPERSCRIPT THREE
  5187. (Unicode:#$00B4; Attr:daCompat; Ch1:#$0020; Ch2:#$0301; Ch3:#$FFFF), // ACUTE ACCENT
  5188. (Unicode:#$00B5; Attr:daCompat; Ch1:#$03BC; Ch2:#$FFFF), // MICRO SIGN
  5189. (Unicode:#$00B8; Attr:daCompat; Ch1:#$0020; Ch2:#$0327; Ch3:#$FFFF), // CEDILLA
  5190. (Unicode:#$00B9; Attr:daSuper; Ch1:#$0031; Ch2:#$FFFF), // SUPERSCRIPT ONE
  5191. (Unicode:#$00BA; Attr:daSuper; Ch1:#$006F; Ch2:#$FFFF), // MASCULINE ORDINAL INDICATOR
  5192. (Unicode:#$00BC; Attr:daFraction; Ch1:#$0031; Ch2:#$2044; Ch3:#$0034; Ch4:#$FFFF), // VULGAR FRACTION ONE QUARTER
  5193. (Unicode:#$00BD; Attr:daFraction; Ch1:#$0031; Ch2:#$2044; Ch3:#$0032; Ch4:#$FFFF), // VULGAR FRACTION ONE HALF
  5194. (Unicode:#$00BE; Attr:daFraction; Ch1:#$0033; Ch2:#$2044; Ch3:#$0034; Ch4:#$FFFF), // VULGAR FRACTION THREE QUARTERS
  5195. (Unicode:#$00C0; Attr:daNone; Ch1:#$0041; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH GRAVE
  5196. (Unicode:#$00C1; Attr:daNone; Ch1:#$0041; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH ACUTE
  5197. (Unicode:#$00C2; Attr:daNone; Ch1:#$0041; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
  5198. (Unicode:#$00C3; Attr:daNone; Ch1:#$0041; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH TILDE
  5199. (Unicode:#$00C4; Attr:daNone; Ch1:#$0041; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH DIAERESIS
  5200. (Unicode:#$00C5; Attr:daNone; Ch1:#$0041; Ch2:#$030A; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH RING ABOVE
  5201. (Unicode:#$00C7; Attr:daNone; Ch1:#$0043; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER C WITH CEDILLA
  5202. (Unicode:#$00C8; Attr:daNone; Ch1:#$0045; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH GRAVE
  5203. (Unicode:#$00C9; Attr:daNone; Ch1:#$0045; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH ACUTE
  5204. (Unicode:#$00CA; Attr:daNone; Ch1:#$0045; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
  5205. (Unicode:#$00CB; Attr:daNone; Ch1:#$0045; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH DIAERESIS
  5206. (Unicode:#$00CC; Attr:daNone; Ch1:#$0049; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH GRAVE
  5207. (Unicode:#$00CD; Attr:daNone; Ch1:#$0049; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH ACUTE
  5208. (Unicode:#$00CE; Attr:daNone; Ch1:#$0049; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
  5209. (Unicode:#$00CF; Attr:daNone; Ch1:#$0049; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH DIAERESIS
  5210. (Unicode:#$00D1; Attr:daNone; Ch1:#$004E; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH TILDE
  5211. (Unicode:#$00D2; Attr:daNone; Ch1:#$004F; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH GRAVE
  5212. (Unicode:#$00D3; Attr:daNone; Ch1:#$004F; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH ACUTE
  5213. (Unicode:#$00D4; Attr:daNone; Ch1:#$004F; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
  5214. (Unicode:#$00D5; Attr:daNone; Ch1:#$004F; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH TILDE
  5215. (Unicode:#$00D6; Attr:daNone; Ch1:#$004F; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH DIAERESIS
  5216. (Unicode:#$00D9; Attr:daNone; Ch1:#$0055; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH GRAVE
  5217. (Unicode:#$00DA; Attr:daNone; Ch1:#$0055; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH ACUTE
  5218. (Unicode:#$00DB; Attr:daNone; Ch1:#$0055; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
  5219. (Unicode:#$00DC; Attr:daNone; Ch1:#$0055; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DIAERESIS
  5220. (Unicode:#$00DD; Attr:daNone; Ch1:#$0059; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH ACUTE
  5221. (Unicode:#$00E0; Attr:daNone; Ch1:#$0061; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH GRAVE
  5222. (Unicode:#$00E1; Attr:daNone; Ch1:#$0061; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH ACUTE
  5223. (Unicode:#$00E2; Attr:daNone; Ch1:#$0061; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH CIRCUMFLEX
  5224. (Unicode:#$00E3; Attr:daNone; Ch1:#$0061; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH TILDE
  5225. (Unicode:#$00E4; Attr:daNone; Ch1:#$0061; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH DIAERESIS
  5226. (Unicode:#$00E5; Attr:daNone; Ch1:#$0061; Ch2:#$030A; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH RING ABOVE
  5227. (Unicode:#$00E7; Attr:daNone; Ch1:#$0063; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER C WITH CEDILLA
  5228. (Unicode:#$00E8; Attr:daNone; Ch1:#$0065; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH GRAVE
  5229. (Unicode:#$00E9; Attr:daNone; Ch1:#$0065; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH ACUTE
  5230. (Unicode:#$00EA; Attr:daNone; Ch1:#$0065; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CIRCUMFLEX
  5231. (Unicode:#$00EB; Attr:daNone; Ch1:#$0065; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH DIAERESIS
  5232. (Unicode:#$00EC; Attr:daNone; Ch1:#$0069; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH GRAVE
  5233. (Unicode:#$00ED; Attr:daNone; Ch1:#$0069; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH ACUTE
  5234. (Unicode:#$00EE; Attr:daNone; Ch1:#$0069; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH CIRCUMFLEX
  5235. (Unicode:#$00EF; Attr:daNone; Ch1:#$0069; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH DIAERESIS
  5236. (Unicode:#$00F1; Attr:daNone; Ch1:#$006E; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH TILDE
  5237. (Unicode:#$00F2; Attr:daNone; Ch1:#$006F; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH GRAVE
  5238. (Unicode:#$00F3; Attr:daNone; Ch1:#$006F; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH ACUTE
  5239. (Unicode:#$00F4; Attr:daNone; Ch1:#$006F; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH CIRCUMFLEX
  5240. (Unicode:#$00F5; Attr:daNone; Ch1:#$006F; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH TILDE
  5241. (Unicode:#$00F6; Attr:daNone; Ch1:#$006F; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH DIAERESIS
  5242. (Unicode:#$00F9; Attr:daNone; Ch1:#$0075; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH GRAVE
  5243. (Unicode:#$00FA; Attr:daNone; Ch1:#$0075; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH ACUTE
  5244. (Unicode:#$00FB; Attr:daNone; Ch1:#$0075; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH CIRCUMFLEX
  5245. (Unicode:#$00FC; Attr:daNone; Ch1:#$0075; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DIAERESIS
  5246. (Unicode:#$00FD; Attr:daNone; Ch1:#$0079; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH ACUTE
  5247. (Unicode:#$00FF; Attr:daNone; Ch1:#$0079; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH DIAERESIS
  5248. (Unicode:#$0100; Attr:daNone; Ch1:#$0041; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH MACRON
  5249. (Unicode:#$0101; Attr:daNone; Ch1:#$0061; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH MACRON
  5250. (Unicode:#$0102; Attr:daNone; Ch1:#$0041; Ch2:#$0306; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH BREVE
  5251. (Unicode:#$0103; Attr:daNone; Ch1:#$0061; Ch2:#$0306; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH BREVE
  5252. (Unicode:#$0104; Attr:daNone; Ch1:#$0041; Ch2:#$0328; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH OGONEK
  5253. (Unicode:#$0105; Attr:daNone; Ch1:#$0061; Ch2:#$0328; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH OGONEK
  5254. (Unicode:#$0106; Attr:daNone; Ch1:#$0043; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER C WITH ACUTE
  5255. (Unicode:#$0107; Attr:daNone; Ch1:#$0063; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER C WITH ACUTE
  5256. (Unicode:#$0108; Attr:daNone; Ch1:#$0043; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
  5257. (Unicode:#$0109; Attr:daNone; Ch1:#$0063; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER C WITH CIRCUMFLEX
  5258. (Unicode:#$010A; Attr:daNone; Ch1:#$0043; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER C WITH DOT ABOVE
  5259. (Unicode:#$010B; Attr:daNone; Ch1:#$0063; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER C WITH DOT ABOVE
  5260. (Unicode:#$010C; Attr:daNone; Ch1:#$0043; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER C WITH CARON
  5261. (Unicode:#$010D; Attr:daNone; Ch1:#$0063; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER C WITH CARON
  5262. (Unicode:#$010E; Attr:daNone; Ch1:#$0044; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER D WITH CARON
  5263. (Unicode:#$010F; Attr:daNone; Ch1:#$0064; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER D WITH CARON
  5264. (Unicode:#$0112; Attr:daNone; Ch1:#$0045; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH MACRON
  5265. (Unicode:#$0113; Attr:daNone; Ch1:#$0065; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH MACRON
  5266. (Unicode:#$0114; Attr:daNone; Ch1:#$0045; Ch2:#$0306; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH BREVE
  5267. (Unicode:#$0115; Attr:daNone; Ch1:#$0065; Ch2:#$0306; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH BREVE
  5268. (Unicode:#$0116; Attr:daNone; Ch1:#$0045; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH DOT ABOVE
  5269. (Unicode:#$0117; Attr:daNone; Ch1:#$0065; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH DOT ABOVE
  5270. (Unicode:#$0118; Attr:daNone; Ch1:#$0045; Ch2:#$0328; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH OGONEK
  5271. (Unicode:#$0119; Attr:daNone; Ch1:#$0065; Ch2:#$0328; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH OGONEK
  5272. (Unicode:#$011A; Attr:daNone; Ch1:#$0045; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CARON
  5273. (Unicode:#$011B; Attr:daNone; Ch1:#$0065; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CARON
  5274. (Unicode:#$011C; Attr:daNone; Ch1:#$0047; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
  5275. (Unicode:#$011D; Attr:daNone; Ch1:#$0067; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER G WITH CIRCUMFLEX
  5276. (Unicode:#$011E; Attr:daNone; Ch1:#$0047; Ch2:#$0306; Ch3:#$FFFF), // LATIN CAPITAL LETTER G WITH BREVE
  5277. (Unicode:#$011F; Attr:daNone; Ch1:#$0067; Ch2:#$0306; Ch3:#$FFFF), // LATIN SMALL LETTER G WITH BREVE
  5278. (Unicode:#$0120; Attr:daNone; Ch1:#$0047; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER G WITH DOT ABOVE
  5279. (Unicode:#$0121; Attr:daNone; Ch1:#$0067; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER G WITH DOT ABOVE
  5280. (Unicode:#$0122; Attr:daNone; Ch1:#$0047; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER G WITH CEDILLA
  5281. (Unicode:#$0123; Attr:daNone; Ch1:#$0067; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER G WITH CEDILLA
  5282. (Unicode:#$0124; Attr:daNone; Ch1:#$0048; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
  5283. (Unicode:#$0125; Attr:daNone; Ch1:#$0068; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER H WITH CIRCUMFLEX
  5284. (Unicode:#$0128; Attr:daNone; Ch1:#$0049; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH TILDE
  5285. (Unicode:#$0129; Attr:daNone; Ch1:#$0069; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH TILDE
  5286. (Unicode:#$012A; Attr:daNone; Ch1:#$0049; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH MACRON
  5287. (Unicode:#$012B; Attr:daNone; Ch1:#$0069; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH MACRON
  5288. (Unicode:#$012C; Attr:daNone; Ch1:#$0049; Ch2:#$0306; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH BREVE
  5289. (Unicode:#$012D; Attr:daNone; Ch1:#$0069; Ch2:#$0306; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH BREVE
  5290. (Unicode:#$012E; Attr:daNone; Ch1:#$0049; Ch2:#$0328; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH OGONEK
  5291. (Unicode:#$012F; Attr:daNone; Ch1:#$0069; Ch2:#$0328; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH OGONEK
  5292. (Unicode:#$0130; Attr:daNone; Ch1:#$0049; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH DOT ABOVE
  5293. (Unicode:#$0132; Attr:daCompat; Ch1:#$0049; Ch2:#$004A; Ch3:#$FFFF), // LATIN CAPITAL LIGATURE IJ
  5294. (Unicode:#$0133; Attr:daCompat; Ch1:#$0069; Ch2:#$006A; Ch3:#$FFFF), // LATIN SMALL LIGATURE IJ
  5295. (Unicode:#$0134; Attr:daNone; Ch1:#$004A; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
  5296. (Unicode:#$0135; Attr:daNone; Ch1:#$006A; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER J WITH CIRCUMFLEX
  5297. (Unicode:#$0136; Attr:daNone; Ch1:#$004B; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER K WITH CEDILLA
  5298. (Unicode:#$0137; Attr:daNone; Ch1:#$006B; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER K WITH CEDILLA
  5299. (Unicode:#$0139; Attr:daNone; Ch1:#$004C; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH ACUTE
  5300. (Unicode:#$013A; Attr:daNone; Ch1:#$006C; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER L WITH ACUTE
  5301. (Unicode:#$013B; Attr:daNone; Ch1:#$004C; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH CEDILLA
  5302. (Unicode:#$013C; Attr:daNone; Ch1:#$006C; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER L WITH CEDILLA
  5303. (Unicode:#$013D; Attr:daNone; Ch1:#$004C; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH CARON
  5304. (Unicode:#$013E; Attr:daNone; Ch1:#$006C; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER L WITH CARON
  5305. (Unicode:#$013F; Attr:daCompat; Ch1:#$004C; Ch2:#$00B7; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH MIDDLE DOT
  5306. (Unicode:#$0140; Attr:daCompat; Ch1:#$006C; Ch2:#$00B7; Ch3:#$FFFF), // LATIN SMALL LETTER L WITH MIDDLE DOT
  5307. (Unicode:#$0143; Attr:daNone; Ch1:#$004E; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH ACUTE
  5308. (Unicode:#$0144; Attr:daNone; Ch1:#$006E; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH ACUTE
  5309. (Unicode:#$0145; Attr:daNone; Ch1:#$004E; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH CEDILLA
  5310. (Unicode:#$0146; Attr:daNone; Ch1:#$006E; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH CEDILLA
  5311. (Unicode:#$0147; Attr:daNone; Ch1:#$004E; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH CARON
  5312. (Unicode:#$0148; Attr:daNone; Ch1:#$006E; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH CARON
  5313. (Unicode:#$0149; Attr:daCompat; Ch1:#$02BC; Ch2:#$006E; Ch3:#$FFFF), // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
  5314. (Unicode:#$014C; Attr:daNone; Ch1:#$004F; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH MACRON
  5315. (Unicode:#$014D; Attr:daNone; Ch1:#$006F; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH MACRON
  5316. (Unicode:#$014E; Attr:daNone; Ch1:#$004F; Ch2:#$0306; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH BREVE
  5317. (Unicode:#$014F; Attr:daNone; Ch1:#$006F; Ch2:#$0306; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH BREVE
  5318. (Unicode:#$0150; Attr:daNone; Ch1:#$004F; Ch2:#$030B; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
  5319. (Unicode:#$0151; Attr:daNone; Ch1:#$006F; Ch2:#$030B; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH DOUBLE ACUTE
  5320. (Unicode:#$0154; Attr:daNone; Ch1:#$0052; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH ACUTE
  5321. (Unicode:#$0155; Attr:daNone; Ch1:#$0072; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH ACUTE
  5322. (Unicode:#$0156; Attr:daNone; Ch1:#$0052; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH CEDILLA
  5323. (Unicode:#$0157; Attr:daNone; Ch1:#$0072; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH CEDILLA
  5324. (Unicode:#$0158; Attr:daNone; Ch1:#$0052; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH CARON
  5325. (Unicode:#$0159; Attr:daNone; Ch1:#$0072; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH CARON
  5326. (Unicode:#$015A; Attr:daNone; Ch1:#$0053; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH ACUTE
  5327. (Unicode:#$015B; Attr:daNone; Ch1:#$0073; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH ACUTE
  5328. (Unicode:#$015C; Attr:daNone; Ch1:#$0053; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
  5329. (Unicode:#$015D; Attr:daNone; Ch1:#$0073; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH CIRCUMFLEX
  5330. (Unicode:#$015E; Attr:daNone; Ch1:#$0053; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH CEDILLA
  5331. (Unicode:#$015F; Attr:daNone; Ch1:#$0073; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH CEDILLA
  5332. (Unicode:#$0160; Attr:daNone; Ch1:#$0053; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH CARON
  5333. (Unicode:#$0161; Attr:daNone; Ch1:#$0073; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH CARON
  5334. (Unicode:#$0162; Attr:daNone; Ch1:#$0054; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER T WITH CEDILLA
  5335. (Unicode:#$0163; Attr:daNone; Ch1:#$0074; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER T WITH CEDILLA
  5336. (Unicode:#$0164; Attr:daNone; Ch1:#$0054; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER T WITH CARON
  5337. (Unicode:#$0165; Attr:daNone; Ch1:#$0074; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER T WITH CARON
  5338. (Unicode:#$0168; Attr:daNone; Ch1:#$0055; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH TILDE
  5339. (Unicode:#$0169; Attr:daNone; Ch1:#$0075; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH TILDE
  5340. (Unicode:#$016A; Attr:daNone; Ch1:#$0055; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH MACRON
  5341. (Unicode:#$016B; Attr:daNone; Ch1:#$0075; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH MACRON
  5342. (Unicode:#$016C; Attr:daNone; Ch1:#$0055; Ch2:#$0306; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH BREVE
  5343. (Unicode:#$016D; Attr:daNone; Ch1:#$0075; Ch2:#$0306; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH BREVE
  5344. (Unicode:#$016E; Attr:daNone; Ch1:#$0055; Ch2:#$030A; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH RING ABOVE
  5345. (Unicode:#$016F; Attr:daNone; Ch1:#$0075; Ch2:#$030A; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH RING ABOVE
  5346. (Unicode:#$0170; Attr:daNone; Ch1:#$0055; Ch2:#$030B; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
  5347. (Unicode:#$0171; Attr:daNone; Ch1:#$0075; Ch2:#$030B; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DOUBLE ACUTE
  5348. (Unicode:#$0172; Attr:daNone; Ch1:#$0055; Ch2:#$0328; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH OGONEK
  5349. (Unicode:#$0173; Attr:daNone; Ch1:#$0075; Ch2:#$0328; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH OGONEK
  5350. (Unicode:#$0174; Attr:daNone; Ch1:#$0057; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
  5351. (Unicode:#$0175; Attr:daNone; Ch1:#$0077; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER W WITH CIRCUMFLEX
  5352. (Unicode:#$0176; Attr:daNone; Ch1:#$0059; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
  5353. (Unicode:#$0177; Attr:daNone; Ch1:#$0079; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH CIRCUMFLEX
  5354. (Unicode:#$0178; Attr:daNone; Ch1:#$0059; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH DIAERESIS
  5355. (Unicode:#$0179; Attr:daNone; Ch1:#$005A; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER Z WITH ACUTE
  5356. (Unicode:#$017A; Attr:daNone; Ch1:#$007A; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER Z WITH ACUTE
  5357. (Unicode:#$017B; Attr:daNone; Ch1:#$005A; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER Z WITH DOT ABOVE
  5358. (Unicode:#$017C; Attr:daNone; Ch1:#$007A; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER Z WITH DOT ABOVE
  5359. (Unicode:#$017D; Attr:daNone; Ch1:#$005A; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER Z WITH CARON
  5360. (Unicode:#$017E; Attr:daNone; Ch1:#$007A; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER Z WITH CARON
  5361. (Unicode:#$017F; Attr:daCompat; Ch1:#$0073; Ch2:#$FFFF), // LATIN SMALL LETTER LONG S
  5362. (Unicode:#$01A0; Attr:daNone; Ch1:#$004F; Ch2:#$031B; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH HORN
  5363. (Unicode:#$01A1; Attr:daNone; Ch1:#$006F; Ch2:#$031B; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH HORN
  5364. (Unicode:#$01AF; Attr:daNone; Ch1:#$0055; Ch2:#$031B; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH HORN
  5365. (Unicode:#$01B0; Attr:daNone; Ch1:#$0075; Ch2:#$031B; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH HORN
  5366. (Unicode:#$01C4; Attr:daCompat; Ch1:#$0044; Ch2:#$017D; Ch3:#$FFFF), // LATIN CAPITAL LETTER DZ WITH CARON
  5367. (Unicode:#$01C5; Attr:daCompat; Ch1:#$0044; Ch2:#$017E; Ch3:#$FFFF), // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
  5368. (Unicode:#$01C6; Attr:daCompat; Ch1:#$0064; Ch2:#$017E; Ch3:#$FFFF), // LATIN SMALL LETTER DZ WITH CARON
  5369. (Unicode:#$01C7; Attr:daCompat; Ch1:#$004C; Ch2:#$004A; Ch3:#$FFFF), // LATIN CAPITAL LETTER LJ
  5370. (Unicode:#$01C8; Attr:daCompat; Ch1:#$004C; Ch2:#$006A; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH SMALL LETTER J
  5371. (Unicode:#$01C9; Attr:daCompat; Ch1:#$006C; Ch2:#$006A; Ch3:#$FFFF), // LATIN SMALL LETTER LJ
  5372. (Unicode:#$01CA; Attr:daCompat; Ch1:#$004E; Ch2:#$004A; Ch3:#$FFFF), // LATIN CAPITAL LETTER NJ
  5373. (Unicode:#$01CB; Attr:daCompat; Ch1:#$004E; Ch2:#$006A; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH SMALL LETTER J
  5374. (Unicode:#$01CC; Attr:daCompat; Ch1:#$006E; Ch2:#$006A; Ch3:#$FFFF), // LATIN SMALL LETTER NJ
  5375. (Unicode:#$01CD; Attr:daNone; Ch1:#$0041; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH CARON
  5376. (Unicode:#$01CE; Attr:daNone; Ch1:#$0061; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH CARON
  5377. (Unicode:#$01CF; Attr:daNone; Ch1:#$0049; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH CARON
  5378. (Unicode:#$01D0; Attr:daNone; Ch1:#$0069; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH CARON
  5379. (Unicode:#$01D1; Attr:daNone; Ch1:#$004F; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH CARON
  5380. (Unicode:#$01D2; Attr:daNone; Ch1:#$006F; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH CARON
  5381. (Unicode:#$01D3; Attr:daNone; Ch1:#$0055; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH CARON
  5382. (Unicode:#$01D4; Attr:daNone; Ch1:#$0075; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH CARON
  5383. (Unicode:#$01D5; Attr:daNone; Ch1:#$00DC; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
  5384. (Unicode:#$01D6; Attr:daNone; Ch1:#$00FC; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
  5385. (Unicode:#$01D7; Attr:daNone; Ch1:#$00DC; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
  5386. (Unicode:#$01D8; Attr:daNone; Ch1:#$00FC; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
  5387. (Unicode:#$01D9; Attr:daNone; Ch1:#$00DC; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
  5388. (Unicode:#$01DA; Attr:daNone; Ch1:#$00FC; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DIAERESIS AND CARON
  5389. (Unicode:#$01DB; Attr:daNone; Ch1:#$00DC; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
  5390. (Unicode:#$01DC; Attr:daNone; Ch1:#$00FC; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
  5391. (Unicode:#$01DE; Attr:daNone; Ch1:#$00C4; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
  5392. (Unicode:#$01DF; Attr:daNone; Ch1:#$00E4; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
  5393. (Unicode:#$01E0; Attr:daNone; Ch1:#$0226; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
  5394. (Unicode:#$01E1; Attr:daNone; Ch1:#$0227; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
  5395. (Unicode:#$01E2; Attr:daNone; Ch1:#$00C6; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER AE WITH MACRON
  5396. (Unicode:#$01E3; Attr:daNone; Ch1:#$00E6; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER AE WITH MACRON
  5397. (Unicode:#$01E6; Attr:daNone; Ch1:#$0047; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER G WITH CARON
  5398. (Unicode:#$01E7; Attr:daNone; Ch1:#$0067; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER G WITH CARON
  5399. (Unicode:#$01E8; Attr:daNone; Ch1:#$004B; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER K WITH CARON
  5400. (Unicode:#$01E9; Attr:daNone; Ch1:#$006B; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER K WITH CARON
  5401. (Unicode:#$01EA; Attr:daNone; Ch1:#$004F; Ch2:#$0328; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH OGONEK
  5402. (Unicode:#$01EB; Attr:daNone; Ch1:#$006F; Ch2:#$0328; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH OGONEK
  5403. (Unicode:#$01EC; Attr:daNone; Ch1:#$01EA; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
  5404. (Unicode:#$01ED; Attr:daNone; Ch1:#$01EB; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH OGONEK AND MACRON
  5405. (Unicode:#$01EE; Attr:daNone; Ch1:#$01B7; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER EZH WITH CARON
  5406. (Unicode:#$01EF; Attr:daNone; Ch1:#$0292; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER EZH WITH CARON
  5407. (Unicode:#$01F0; Attr:daNone; Ch1:#$006A; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER J WITH CARON
  5408. (Unicode:#$01F1; Attr:daCompat; Ch1:#$0044; Ch2:#$005A; Ch3:#$FFFF), // LATIN CAPITAL LETTER DZ
  5409. (Unicode:#$01F2; Attr:daCompat; Ch1:#$0044; Ch2:#$007A; Ch3:#$FFFF), // LATIN CAPITAL LETTER D WITH SMALL LETTER Z
  5410. (Unicode:#$01F3; Attr:daCompat; Ch1:#$0064; Ch2:#$007A; Ch3:#$FFFF), // LATIN SMALL LETTER DZ
  5411. (Unicode:#$01F4; Attr:daNone; Ch1:#$0047; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER G WITH ACUTE
  5412. (Unicode:#$01F5; Attr:daNone; Ch1:#$0067; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER G WITH ACUTE
  5413. (Unicode:#$01F8; Attr:daNone; Ch1:#$004E; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH GRAVE
  5414. (Unicode:#$01F9; Attr:daNone; Ch1:#$006E; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH GRAVE
  5415. (Unicode:#$01FA; Attr:daNone; Ch1:#$00C5; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
  5416. (Unicode:#$01FB; Attr:daNone; Ch1:#$00E5; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
  5417. (Unicode:#$01FC; Attr:daNone; Ch1:#$00C6; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER AE WITH ACUTE
  5418. (Unicode:#$01FD; Attr:daNone; Ch1:#$00E6; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER AE WITH ACUTE
  5419. (Unicode:#$01FE; Attr:daNone; Ch1:#$00D8; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
  5420. (Unicode:#$01FF; Attr:daNone; Ch1:#$00F8; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH STROKE AND ACUTE
  5421. (Unicode:#$0200; Attr:daNone; Ch1:#$0041; Ch2:#$030F; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
  5422. (Unicode:#$0201; Attr:daNone; Ch1:#$0061; Ch2:#$030F; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH DOUBLE GRAVE
  5423. (Unicode:#$0202; Attr:daNone; Ch1:#$0041; Ch2:#$0311; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH INVERTED BREVE
  5424. (Unicode:#$0203; Attr:daNone; Ch1:#$0061; Ch2:#$0311; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH INVERTED BREVE
  5425. (Unicode:#$0204; Attr:daNone; Ch1:#$0045; Ch2:#$030F; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
  5426. (Unicode:#$0205; Attr:daNone; Ch1:#$0065; Ch2:#$030F; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH DOUBLE GRAVE
  5427. (Unicode:#$0206; Attr:daNone; Ch1:#$0045; Ch2:#$0311; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH INVERTED BREVE
  5428. (Unicode:#$0207; Attr:daNone; Ch1:#$0065; Ch2:#$0311; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH INVERTED BREVE
  5429. (Unicode:#$0208; Attr:daNone; Ch1:#$0049; Ch2:#$030F; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
  5430. (Unicode:#$0209; Attr:daNone; Ch1:#$0069; Ch2:#$030F; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH DOUBLE GRAVE
  5431. (Unicode:#$020A; Attr:daNone; Ch1:#$0049; Ch2:#$0311; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH INVERTED BREVE
  5432. (Unicode:#$020B; Attr:daNone; Ch1:#$0069; Ch2:#$0311; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH INVERTED BREVE
  5433. (Unicode:#$020C; Attr:daNone; Ch1:#$004F; Ch2:#$030F; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
  5434. (Unicode:#$020D; Attr:daNone; Ch1:#$006F; Ch2:#$030F; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH DOUBLE GRAVE
  5435. (Unicode:#$020E; Attr:daNone; Ch1:#$004F; Ch2:#$0311; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH INVERTED BREVE
  5436. (Unicode:#$020F; Attr:daNone; Ch1:#$006F; Ch2:#$0311; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH INVERTED BREVE
  5437. (Unicode:#$0210; Attr:daNone; Ch1:#$0052; Ch2:#$030F; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
  5438. (Unicode:#$0211; Attr:daNone; Ch1:#$0072; Ch2:#$030F; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH DOUBLE GRAVE
  5439. (Unicode:#$0212; Attr:daNone; Ch1:#$0052; Ch2:#$0311; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH INVERTED BREVE
  5440. (Unicode:#$0213; Attr:daNone; Ch1:#$0072; Ch2:#$0311; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH INVERTED BREVE
  5441. (Unicode:#$0214; Attr:daNone; Ch1:#$0055; Ch2:#$030F; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
  5442. (Unicode:#$0215; Attr:daNone; Ch1:#$0075; Ch2:#$030F; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DOUBLE GRAVE
  5443. (Unicode:#$0216; Attr:daNone; Ch1:#$0055; Ch2:#$0311; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH INVERTED BREVE
  5444. (Unicode:#$0217; Attr:daNone; Ch1:#$0075; Ch2:#$0311; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH INVERTED BREVE
  5445. (Unicode:#$0218; Attr:daNone; Ch1:#$0053; Ch2:#$0326; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH COMMA BELOW
  5446. (Unicode:#$0219; Attr:daNone; Ch1:#$0073; Ch2:#$0326; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH COMMA BELOW
  5447. (Unicode:#$021A; Attr:daNone; Ch1:#$0054; Ch2:#$0326; Ch3:#$FFFF), // LATIN CAPITAL LETTER T WITH COMMA BELOW
  5448. (Unicode:#$021B; Attr:daNone; Ch1:#$0074; Ch2:#$0326; Ch3:#$FFFF), // LATIN SMALL LETTER T WITH COMMA BELOW
  5449. (Unicode:#$021E; Attr:daNone; Ch1:#$0048; Ch2:#$030C; Ch3:#$FFFF), // LATIN CAPITAL LETTER H WITH CARON
  5450. (Unicode:#$021F; Attr:daNone; Ch1:#$0068; Ch2:#$030C; Ch3:#$FFFF), // LATIN SMALL LETTER H WITH CARON
  5451. (Unicode:#$0226; Attr:daNone; Ch1:#$0041; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH DOT ABOVE
  5452. (Unicode:#$0227; Attr:daNone; Ch1:#$0061; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH DOT ABOVE
  5453. (Unicode:#$0228; Attr:daNone; Ch1:#$0045; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CEDILLA
  5454. (Unicode:#$0229; Attr:daNone; Ch1:#$0065; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CEDILLA
  5455. (Unicode:#$022A; Attr:daNone; Ch1:#$00D6; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
  5456. (Unicode:#$022B; Attr:daNone; Ch1:#$00F6; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
  5457. (Unicode:#$022C; Attr:daNone; Ch1:#$00D5; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH TILDE AND MACRON
  5458. (Unicode:#$022D; Attr:daNone; Ch1:#$00F5; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH TILDE AND MACRON
  5459. (Unicode:#$022E; Attr:daNone; Ch1:#$004F; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH DOT ABOVE
  5460. (Unicode:#$022F; Attr:daNone; Ch1:#$006F; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH DOT ABOVE
  5461. (Unicode:#$0230; Attr:daNone; Ch1:#$022E; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
  5462. (Unicode:#$0231; Attr:daNone; Ch1:#$022F; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
  5463. (Unicode:#$0232; Attr:daNone; Ch1:#$0059; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH MACRON
  5464. (Unicode:#$0233; Attr:daNone; Ch1:#$0079; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH MACRON
  5465. (Unicode:#$02B0; Attr:daSuper; Ch1:#$0068; Ch2:#$FFFF), // MODIFIER LETTER SMALL H
  5466. (Unicode:#$02B1; Attr:daSuper; Ch1:#$0266; Ch2:#$FFFF), // MODIFIER LETTER SMALL H WITH HOOK
  5467. (Unicode:#$02B2; Attr:daSuper; Ch1:#$006A; Ch2:#$FFFF), // MODIFIER LETTER SMALL J
  5468. (Unicode:#$02B3; Attr:daSuper; Ch1:#$0072; Ch2:#$FFFF), // MODIFIER LETTER SMALL R
  5469. (Unicode:#$02B4; Attr:daSuper; Ch1:#$0279; Ch2:#$FFFF), // MODIFIER LETTER SMALL TURNED R
  5470. (Unicode:#$02B5; Attr:daSuper; Ch1:#$027B; Ch2:#$FFFF), // MODIFIER LETTER SMALL TURNED R WITH HOOK
  5471. (Unicode:#$02B6; Attr:daSuper; Ch1:#$0281; Ch2:#$FFFF), // MODIFIER LETTER SMALL CAPITAL INVERTED R
  5472. (Unicode:#$02B7; Attr:daSuper; Ch1:#$0077; Ch2:#$FFFF), // MODIFIER LETTER SMALL W
  5473. (Unicode:#$02B8; Attr:daSuper; Ch1:#$0079; Ch2:#$FFFF), // MODIFIER LETTER SMALL Y
  5474. (Unicode:#$02D8; Attr:daCompat; Ch1:#$0020; Ch2:#$0306; Ch3:#$FFFF), // BREVE
  5475. (Unicode:#$02D9; Attr:daCompat; Ch1:#$0020; Ch2:#$0307; Ch3:#$FFFF), // DOT ABOVE
  5476. (Unicode:#$02DA; Attr:daCompat; Ch1:#$0020; Ch2:#$030A; Ch3:#$FFFF), // RING ABOVE
  5477. (Unicode:#$02DB; Attr:daCompat; Ch1:#$0020; Ch2:#$0328; Ch3:#$FFFF), // OGONEK
  5478. (Unicode:#$02DC; Attr:daCompat; Ch1:#$0020; Ch2:#$0303; Ch3:#$FFFF), // SMALL TILDE
  5479. (Unicode:#$02DD; Attr:daCompat; Ch1:#$0020; Ch2:#$030B; Ch3:#$FFFF), // DOUBLE ACUTE ACCENT
  5480. (Unicode:#$02E0; Attr:daSuper; Ch1:#$0263; Ch2:#$FFFF), // MODIFIER LETTER SMALL GAMMA
  5481. (Unicode:#$02E1; Attr:daSuper; Ch1:#$006C; Ch2:#$FFFF), // MODIFIER LETTER SMALL L
  5482. (Unicode:#$02E2; Attr:daSuper; Ch1:#$0073; Ch2:#$FFFF), // MODIFIER LETTER SMALL S
  5483. (Unicode:#$02E3; Attr:daSuper; Ch1:#$0078; Ch2:#$FFFF), // MODIFIER LETTER SMALL X
  5484. (Unicode:#$02E4; Attr:daSuper; Ch1:#$0295; Ch2:#$FFFF), // MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
  5485. (Unicode:#$0340; Attr:daNone; Ch1:#$0300; Ch2:#$FFFF), // COMBINING GRAVE TONE MARK
  5486. (Unicode:#$0341; Attr:daNone; Ch1:#$0301; Ch2:#$FFFF), // COMBINING ACUTE TONE MARK
  5487. (Unicode:#$0343; Attr:daNone; Ch1:#$0313; Ch2:#$FFFF), // COMBINING GREEK KORONIS
  5488. (Unicode:#$0344; Attr:daNone; Ch1:#$0308; Ch2:#$0301; Ch3:#$FFFF), // COMBINING GREEK DIALYTIKA TONOS
  5489. (Unicode:#$0374; Attr:daNone; Ch1:#$02B9; Ch2:#$FFFF), // GREEK NUMERAL SIGN
  5490. (Unicode:#$037A; Attr:daCompat; Ch1:#$0020; Ch2:#$0345; Ch3:#$FFFF), // GREEK YPOGEGRAMMENI
  5491. (Unicode:#$037E; Attr:daNone; Ch1:#$003B; Ch2:#$FFFF), // GREEK QUESTION MARK
  5492. (Unicode:#$0384; Attr:daCompat; Ch1:#$0020; Ch2:#$0301; Ch3:#$FFFF), // GREEK TONOS
  5493. (Unicode:#$0385; Attr:daNone; Ch1:#$00A8; Ch2:#$0301; Ch3:#$FFFF), // GREEK DIALYTIKA TONOS
  5494. (Unicode:#$0386; Attr:daNone; Ch1:#$0391; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH TONOS
  5495. (Unicode:#$0387; Attr:daNone; Ch1:#$00B7; Ch2:#$FFFF), // GREEK ANO TELEIA
  5496. (Unicode:#$0388; Attr:daNone; Ch1:#$0395; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH TONOS
  5497. (Unicode:#$0389; Attr:daNone; Ch1:#$0397; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH TONOS
  5498. (Unicode:#$038A; Attr:daNone; Ch1:#$0399; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH TONOS
  5499. (Unicode:#$038C; Attr:daNone; Ch1:#$039F; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH TONOS
  5500. (Unicode:#$038E; Attr:daNone; Ch1:#$03A5; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH TONOS
  5501. (Unicode:#$038F; Attr:daNone; Ch1:#$03A9; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH TONOS
  5502. (Unicode:#$0390; Attr:daNone; Ch1:#$03CA; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
  5503. (Unicode:#$03AA; Attr:daNone; Ch1:#$0399; Ch2:#$0308; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
  5504. (Unicode:#$03AB; Attr:daNone; Ch1:#$03A5; Ch2:#$0308; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
  5505. (Unicode:#$03AC; Attr:daNone; Ch1:#$03B1; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH TONOS
  5506. (Unicode:#$03AD; Attr:daNone; Ch1:#$03B5; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER EPSILON WITH TONOS
  5507. (Unicode:#$03AE; Attr:daNone; Ch1:#$03B7; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH TONOS
  5508. (Unicode:#$03AF; Attr:daNone; Ch1:#$03B9; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH TONOS
  5509. (Unicode:#$03B0; Attr:daNone; Ch1:#$03CB; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
  5510. (Unicode:#$03CA; Attr:daNone; Ch1:#$03B9; Ch2:#$0308; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA
  5511. (Unicode:#$03CB; Attr:daNone; Ch1:#$03C5; Ch2:#$0308; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA
  5512. (Unicode:#$03CC; Attr:daNone; Ch1:#$03BF; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER OMICRON WITH TONOS
  5513. (Unicode:#$03CD; Attr:daNone; Ch1:#$03C5; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH TONOS
  5514. (Unicode:#$03CE; Attr:daNone; Ch1:#$03C9; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH TONOS
  5515. (Unicode:#$03D0; Attr:daCompat; Ch1:#$03B2; Ch2:#$FFFF), // GREEK BETA SYMBOL
  5516. (Unicode:#$03D1; Attr:daCompat; Ch1:#$03B8; Ch2:#$FFFF), // GREEK THETA SYMBOL
  5517. (Unicode:#$03D2; Attr:daCompat; Ch1:#$03A5; Ch2:#$FFFF), // GREEK UPSILON WITH HOOK SYMBOL
  5518. (Unicode:#$03D3; Attr:daNone; Ch1:#$03D2; Ch2:#$0301; Ch3:#$FFFF), // GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
  5519. (Unicode:#$03D4; Attr:daNone; Ch1:#$03D2; Ch2:#$0308; Ch3:#$FFFF), // GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
  5520. (Unicode:#$03D5; Attr:daCompat; Ch1:#$03C6; Ch2:#$FFFF), // GREEK PHI SYMBOL
  5521. (Unicode:#$03D6; Attr:daCompat; Ch1:#$03C0; Ch2:#$FFFF), // GREEK PI SYMBOL
  5522. (Unicode:#$03F0; Attr:daCompat; Ch1:#$03BA; Ch2:#$FFFF), // GREEK KAPPA SYMBOL
  5523. (Unicode:#$03F1; Attr:daCompat; Ch1:#$03C1; Ch2:#$FFFF), // GREEK RHO SYMBOL
  5524. (Unicode:#$03F2; Attr:daCompat; Ch1:#$03C2; Ch2:#$FFFF), // GREEK LUNATE SIGMA SYMBOL
  5525. (Unicode:#$03F4; Attr:daCompat; Ch1:#$0398; Ch2:#$FFFF), // GREEK CAPITAL THETA SYMBOL
  5526. (Unicode:#$03F5; Attr:daCompat; Ch1:#$03B5; Ch2:#$FFFF), // GREEK LUNATE EPSILON SYMBOL
  5527. (Unicode:#$0400; Attr:daNone; Ch1:#$0415; Ch2:#$0300; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER IE WITH GRAVE
  5528. (Unicode:#$0401; Attr:daNone; Ch1:#$0415; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER IO
  5529. (Unicode:#$0403; Attr:daNone; Ch1:#$0413; Ch2:#$0301; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER GJE
  5530. (Unicode:#$0407; Attr:daNone; Ch1:#$0406; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER YI
  5531. (Unicode:#$040C; Attr:daNone; Ch1:#$041A; Ch2:#$0301; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER KJE
  5532. (Unicode:#$040D; Attr:daNone; Ch1:#$0418; Ch2:#$0300; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER I WITH GRAVE
  5533. (Unicode:#$040E; Attr:daNone; Ch1:#$0423; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER SHORT U
  5534. (Unicode:#$0419; Attr:daNone; Ch1:#$0418; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER SHORT I
  5535. (Unicode:#$0439; Attr:daNone; Ch1:#$0438; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC SMALL LETTER SHORT I
  5536. (Unicode:#$0450; Attr:daNone; Ch1:#$0435; Ch2:#$0300; Ch3:#$FFFF), // CYRILLIC SMALL LETTER IE WITH GRAVE
  5537. (Unicode:#$0451; Attr:daNone; Ch1:#$0435; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER IO
  5538. (Unicode:#$0453; Attr:daNone; Ch1:#$0433; Ch2:#$0301; Ch3:#$FFFF), // CYRILLIC SMALL LETTER GJE
  5539. (Unicode:#$0457; Attr:daNone; Ch1:#$0456; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER YI
  5540. (Unicode:#$045C; Attr:daNone; Ch1:#$043A; Ch2:#$0301; Ch3:#$FFFF), // CYRILLIC SMALL LETTER KJE
  5541. (Unicode:#$045D; Attr:daNone; Ch1:#$0438; Ch2:#$0300; Ch3:#$FFFF), // CYRILLIC SMALL LETTER I WITH GRAVE
  5542. (Unicode:#$045E; Attr:daNone; Ch1:#$0443; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC SMALL LETTER SHORT U
  5543. (Unicode:#$0476; Attr:daNone; Ch1:#$0474; Ch2:#$030F; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
  5544. (Unicode:#$0477; Attr:daNone; Ch1:#$0475; Ch2:#$030F; Ch3:#$FFFF), // CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
  5545. (Unicode:#$04C1; Attr:daNone; Ch1:#$0416; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER ZHE WITH BREVE
  5546. (Unicode:#$04C2; Attr:daNone; Ch1:#$0436; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC SMALL LETTER ZHE WITH BREVE
  5547. (Unicode:#$04D0; Attr:daNone; Ch1:#$0410; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER A WITH BREVE
  5548. (Unicode:#$04D1; Attr:daNone; Ch1:#$0430; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC SMALL LETTER A WITH BREVE
  5549. (Unicode:#$04D2; Attr:daNone; Ch1:#$0410; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER A WITH DIAERESIS
  5550. (Unicode:#$04D3; Attr:daNone; Ch1:#$0430; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER A WITH DIAERESIS
  5551. (Unicode:#$04D6; Attr:daNone; Ch1:#$0415; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER IE WITH BREVE
  5552. (Unicode:#$04D7; Attr:daNone; Ch1:#$0435; Ch2:#$0306; Ch3:#$FFFF), // CYRILLIC SMALL LETTER IE WITH BREVE
  5553. (Unicode:#$04DA; Attr:daNone; Ch1:#$04D8; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
  5554. (Unicode:#$04DB; Attr:daNone; Ch1:#$04D9; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
  5555. (Unicode:#$04DC; Attr:daNone; Ch1:#$0416; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
  5556. (Unicode:#$04DD; Attr:daNone; Ch1:#$0436; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
  5557. (Unicode:#$04DE; Attr:daNone; Ch1:#$0417; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
  5558. (Unicode:#$04DF; Attr:daNone; Ch1:#$0437; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER ZE WITH DIAERESIS
  5559. (Unicode:#$04E2; Attr:daNone; Ch1:#$0418; Ch2:#$0304; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER I WITH MACRON
  5560. (Unicode:#$04E3; Attr:daNone; Ch1:#$0438; Ch2:#$0304; Ch3:#$FFFF), // CYRILLIC SMALL LETTER I WITH MACRON
  5561. (Unicode:#$04E4; Attr:daNone; Ch1:#$0418; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER I WITH DIAERESIS
  5562. (Unicode:#$04E5; Attr:daNone; Ch1:#$0438; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER I WITH DIAERESIS
  5563. (Unicode:#$04E6; Attr:daNone; Ch1:#$041E; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER O WITH DIAERESIS
  5564. (Unicode:#$04E7; Attr:daNone; Ch1:#$043E; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER O WITH DIAERESIS
  5565. (Unicode:#$04EA; Attr:daNone; Ch1:#$04E8; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
  5566. (Unicode:#$04EB; Attr:daNone; Ch1:#$04E9; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
  5567. (Unicode:#$04EC; Attr:daNone; Ch1:#$042D; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER E WITH DIAERESIS
  5568. (Unicode:#$04ED; Attr:daNone; Ch1:#$044D; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER E WITH DIAERESIS
  5569. (Unicode:#$04EE; Attr:daNone; Ch1:#$0423; Ch2:#$0304; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER U WITH MACRON
  5570. (Unicode:#$04EF; Attr:daNone; Ch1:#$0443; Ch2:#$0304; Ch3:#$FFFF), // CYRILLIC SMALL LETTER U WITH MACRON
  5571. (Unicode:#$04F0; Attr:daNone; Ch1:#$0423; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER U WITH DIAERESIS
  5572. (Unicode:#$04F1; Attr:daNone; Ch1:#$0443; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER U WITH DIAERESIS
  5573. (Unicode:#$04F2; Attr:daNone; Ch1:#$0423; Ch2:#$030B; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
  5574. (Unicode:#$04F3; Attr:daNone; Ch1:#$0443; Ch2:#$030B; Ch3:#$FFFF), // CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
  5575. (Unicode:#$04F4; Attr:daNone; Ch1:#$0427; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
  5576. (Unicode:#$04F5; Attr:daNone; Ch1:#$0447; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER CHE WITH DIAERESIS
  5577. (Unicode:#$04F8; Attr:daNone; Ch1:#$042B; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
  5578. (Unicode:#$04F9; Attr:daNone; Ch1:#$044B; Ch2:#$0308; Ch3:#$FFFF), // CYRILLIC SMALL LETTER YERU WITH DIAERESIS
  5579. (Unicode:#$0587; Attr:daCompat; Ch1:#$0565; Ch2:#$0582; Ch3:#$FFFF), // ARMENIAN SMALL LIGATURE ECH YIWN
  5580. (Unicode:#$0622; Attr:daNone; Ch1:#$0627; Ch2:#$0653; Ch3:#$FFFF), // ARABIC LETTER ALEF WITH MADDA ABOVE
  5581. (Unicode:#$0623; Attr:daNone; Ch1:#$0627; Ch2:#$0654; Ch3:#$FFFF), // ARABIC LETTER ALEF WITH HAMZA ABOVE
  5582. (Unicode:#$0624; Attr:daNone; Ch1:#$0648; Ch2:#$0654; Ch3:#$FFFF), // ARABIC LETTER WAW WITH HAMZA ABOVE
  5583. (Unicode:#$0625; Attr:daNone; Ch1:#$0627; Ch2:#$0655; Ch3:#$FFFF), // ARABIC LETTER ALEF WITH HAMZA BELOW
  5584. (Unicode:#$0626; Attr:daNone; Ch1:#$064A; Ch2:#$0654; Ch3:#$FFFF), // ARABIC LETTER YEH WITH HAMZA ABOVE
  5585. (Unicode:#$0675; Attr:daCompat; Ch1:#$0627; Ch2:#$0674; Ch3:#$FFFF), // ARABIC LETTER HIGH HAMZA ALEF
  5586. (Unicode:#$0676; Attr:daCompat; Ch1:#$0648; Ch2:#$0674; Ch3:#$FFFF), // ARABIC LETTER HIGH HAMZA WAW
  5587. (Unicode:#$0677; Attr:daCompat; Ch1:#$06C7; Ch2:#$0674; Ch3:#$FFFF), // ARABIC LETTER U WITH HAMZA ABOVE
  5588. (Unicode:#$0678; Attr:daCompat; Ch1:#$064A; Ch2:#$0674; Ch3:#$FFFF), // ARABIC LETTER HIGH HAMZA YEH
  5589. (Unicode:#$06C0; Attr:daNone; Ch1:#$06D5; Ch2:#$0654; Ch3:#$FFFF), // ARABIC LETTER HEH WITH YEH ABOVE
  5590. (Unicode:#$06C2; Attr:daNone; Ch1:#$06C1; Ch2:#$0654; Ch3:#$FFFF), // ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
  5591. (Unicode:#$06D3; Attr:daNone; Ch1:#$06D2; Ch2:#$0654; Ch3:#$FFFF), // ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
  5592. (Unicode:#$0929; Attr:daNone; Ch1:#$0928; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER NNNA
  5593. (Unicode:#$0931; Attr:daNone; Ch1:#$0930; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER RRA
  5594. (Unicode:#$0934; Attr:daNone; Ch1:#$0933; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER LLLA
  5595. (Unicode:#$0958; Attr:daNone; Ch1:#$0915; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER QA
  5596. (Unicode:#$0959; Attr:daNone; Ch1:#$0916; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER KHHA
  5597. (Unicode:#$095A; Attr:daNone; Ch1:#$0917; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER GHHA
  5598. (Unicode:#$095B; Attr:daNone; Ch1:#$091C; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER ZA
  5599. (Unicode:#$095C; Attr:daNone; Ch1:#$0921; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER DDDHA
  5600. (Unicode:#$095D; Attr:daNone; Ch1:#$0922; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER RHA
  5601. (Unicode:#$095E; Attr:daNone; Ch1:#$092B; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER FA
  5602. (Unicode:#$095F; Attr:daNone; Ch1:#$092F; Ch2:#$093C; Ch3:#$FFFF), // DEVANAGARI LETTER YYA
  5603. (Unicode:#$09CB; Attr:daNone; Ch1:#$09C7; Ch2:#$09BE; Ch3:#$FFFF), // BENGALI VOWEL SIGN O
  5604. (Unicode:#$09CC; Attr:daNone; Ch1:#$09C7; Ch2:#$09D7; Ch3:#$FFFF), // BENGALI VOWEL SIGN AU
  5605. (Unicode:#$09DC; Attr:daNone; Ch1:#$09A1; Ch2:#$09BC; Ch3:#$FFFF), // BENGALI LETTER RRA
  5606. (Unicode:#$09DD; Attr:daNone; Ch1:#$09A2; Ch2:#$09BC; Ch3:#$FFFF), // BENGALI LETTER RHA
  5607. (Unicode:#$09DF; Attr:daNone; Ch1:#$09AF; Ch2:#$09BC; Ch3:#$FFFF), // BENGALI LETTER YYA
  5608. (Unicode:#$0A33; Attr:daNone; Ch1:#$0A32; Ch2:#$0A3C; Ch3:#$FFFF), // GURMUKHI LETTER LLA
  5609. (Unicode:#$0A36; Attr:daNone; Ch1:#$0A38; Ch2:#$0A3C; Ch3:#$FFFF), // GURMUKHI LETTER SHA
  5610. (Unicode:#$0A59; Attr:daNone; Ch1:#$0A16; Ch2:#$0A3C; Ch3:#$FFFF), // GURMUKHI LETTER KHHA
  5611. (Unicode:#$0A5A; Attr:daNone; Ch1:#$0A17; Ch2:#$0A3C; Ch3:#$FFFF), // GURMUKHI LETTER GHHA
  5612. (Unicode:#$0A5B; Attr:daNone; Ch1:#$0A1C; Ch2:#$0A3C; Ch3:#$FFFF), // GURMUKHI LETTER ZA
  5613. (Unicode:#$0A5E; Attr:daNone; Ch1:#$0A2B; Ch2:#$0A3C; Ch3:#$FFFF), // GURMUKHI LETTER FA
  5614. (Unicode:#$0B48; Attr:daNone; Ch1:#$0B47; Ch2:#$0B56; Ch3:#$FFFF), // ORIYA VOWEL SIGN AI
  5615. (Unicode:#$0B4B; Attr:daNone; Ch1:#$0B47; Ch2:#$0B3E; Ch3:#$FFFF), // ORIYA VOWEL SIGN O
  5616. (Unicode:#$0B4C; Attr:daNone; Ch1:#$0B47; Ch2:#$0B57; Ch3:#$FFFF), // ORIYA VOWEL SIGN AU
  5617. (Unicode:#$0B5C; Attr:daNone; Ch1:#$0B21; Ch2:#$0B3C; Ch3:#$FFFF), // ORIYA LETTER RRA
  5618. (Unicode:#$0B5D; Attr:daNone; Ch1:#$0B22; Ch2:#$0B3C; Ch3:#$FFFF), // ORIYA LETTER RHA
  5619. (Unicode:#$0B94; Attr:daNone; Ch1:#$0B92; Ch2:#$0BD7; Ch3:#$FFFF), // TAMIL LETTER AU
  5620. (Unicode:#$0BCA; Attr:daNone; Ch1:#$0BC6; Ch2:#$0BBE; Ch3:#$FFFF), // TAMIL VOWEL SIGN O
  5621. (Unicode:#$0BCB; Attr:daNone; Ch1:#$0BC7; Ch2:#$0BBE; Ch3:#$FFFF), // TAMIL VOWEL SIGN OO
  5622. (Unicode:#$0BCC; Attr:daNone; Ch1:#$0BC6; Ch2:#$0BD7; Ch3:#$FFFF), // TAMIL VOWEL SIGN AU
  5623. (Unicode:#$0C48; Attr:daNone; Ch1:#$0C46; Ch2:#$0C56; Ch3:#$FFFF), // TELUGU VOWEL SIGN AI
  5624. (Unicode:#$0CC0; Attr:daNone; Ch1:#$0CBF; Ch2:#$0CD5; Ch3:#$FFFF), // KANNADA VOWEL SIGN II
  5625. (Unicode:#$0CC7; Attr:daNone; Ch1:#$0CC6; Ch2:#$0CD5; Ch3:#$FFFF), // KANNADA VOWEL SIGN EE
  5626. (Unicode:#$0CC8; Attr:daNone; Ch1:#$0CC6; Ch2:#$0CD6; Ch3:#$FFFF), // KANNADA VOWEL SIGN AI
  5627. (Unicode:#$0CCA; Attr:daNone; Ch1:#$0CC6; Ch2:#$0CC2; Ch3:#$FFFF), // KANNADA VOWEL SIGN O
  5628. (Unicode:#$0CCB; Attr:daNone; Ch1:#$0CCA; Ch2:#$0CD5; Ch3:#$FFFF), // KANNADA VOWEL SIGN OO
  5629. (Unicode:#$0D4A; Attr:daNone; Ch1:#$0D46; Ch2:#$0D3E; Ch3:#$FFFF), // MALAYALAM VOWEL SIGN O
  5630. (Unicode:#$0D4B; Attr:daNone; Ch1:#$0D47; Ch2:#$0D3E; Ch3:#$FFFF), // MALAYALAM VOWEL SIGN OO
  5631. (Unicode:#$0D4C; Attr:daNone; Ch1:#$0D46; Ch2:#$0D57; Ch3:#$FFFF), // MALAYALAM VOWEL SIGN AU
  5632. (Unicode:#$0DDA; Attr:daNone; Ch1:#$0DD9; Ch2:#$0DCA; Ch3:#$FFFF), // SINHALA VOWEL SIGN DIGA KOMBUVA
  5633. (Unicode:#$0DDC; Attr:daNone; Ch1:#$0DD9; Ch2:#$0DCF; Ch3:#$FFFF), // SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
  5634. (Unicode:#$0DDD; Attr:daNone; Ch1:#$0DDC; Ch2:#$0DCA; Ch3:#$FFFF), // SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
  5635. (Unicode:#$0DDE; Attr:daNone; Ch1:#$0DD9; Ch2:#$0DDF; Ch3:#$FFFF), // SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
  5636. (Unicode:#$0E33; Attr:daCompat; Ch1:#$0E4D; Ch2:#$0E32; Ch3:#$FFFF), // THAI CHARACTER SARA AM
  5637. (Unicode:#$0EB3; Attr:daCompat; Ch1:#$0ECD; Ch2:#$0EB2; Ch3:#$FFFF), // LAO VOWEL SIGN AM
  5638. (Unicode:#$0EDC; Attr:daCompat; Ch1:#$0EAB; Ch2:#$0E99; Ch3:#$FFFF), // LAO HO NO
  5639. (Unicode:#$0EDD; Attr:daCompat; Ch1:#$0EAB; Ch2:#$0EA1; Ch3:#$FFFF), // LAO HO MO
  5640. (Unicode:#$0F0C; Attr:daNoBreak; Ch1:#$0F0B; Ch2:#$FFFF), // TIBETAN MARK DELIMITER TSHEG BSTAR
  5641. (Unicode:#$0F43; Attr:daNone; Ch1:#$0F42; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN LETTER GHA
  5642. (Unicode:#$0F4D; Attr:daNone; Ch1:#$0F4C; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN LETTER DDHA
  5643. (Unicode:#$0F52; Attr:daNone; Ch1:#$0F51; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN LETTER DHA
  5644. (Unicode:#$0F57; Attr:daNone; Ch1:#$0F56; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN LETTER BHA
  5645. (Unicode:#$0F5C; Attr:daNone; Ch1:#$0F5B; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN LETTER DZHA
  5646. (Unicode:#$0F69; Attr:daNone; Ch1:#$0F40; Ch2:#$0FB5; Ch3:#$FFFF), // TIBETAN LETTER KSSA
  5647. (Unicode:#$0F73; Attr:daNone; Ch1:#$0F71; Ch2:#$0F72; Ch3:#$FFFF), // TIBETAN VOWEL SIGN II
  5648. (Unicode:#$0F75; Attr:daNone; Ch1:#$0F71; Ch2:#$0F74; Ch3:#$FFFF), // TIBETAN VOWEL SIGN UU
  5649. (Unicode:#$0F76; Attr:daNone; Ch1:#$0FB2; Ch2:#$0F80; Ch3:#$FFFF), // TIBETAN VOWEL SIGN VOCALIC R
  5650. (Unicode:#$0F77; Attr:daCompat; Ch1:#$0FB2; Ch2:#$0F81; Ch3:#$FFFF), // TIBETAN VOWEL SIGN VOCALIC RR
  5651. (Unicode:#$0F78; Attr:daNone; Ch1:#$0FB3; Ch2:#$0F80; Ch3:#$FFFF), // TIBETAN VOWEL SIGN VOCALIC L
  5652. (Unicode:#$0F79; Attr:daCompat; Ch1:#$0FB3; Ch2:#$0F81; Ch3:#$FFFF), // TIBETAN VOWEL SIGN VOCALIC LL
  5653. (Unicode:#$0F81; Attr:daNone; Ch1:#$0F71; Ch2:#$0F80; Ch3:#$FFFF), // TIBETAN VOWEL SIGN REVERSED II
  5654. (Unicode:#$0F93; Attr:daNone; Ch1:#$0F92; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN SUBJOINED LETTER GHA
  5655. (Unicode:#$0F9D; Attr:daNone; Ch1:#$0F9C; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN SUBJOINED LETTER DDHA
  5656. (Unicode:#$0FA2; Attr:daNone; Ch1:#$0FA1; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN SUBJOINED LETTER DHA
  5657. (Unicode:#$0FA7; Attr:daNone; Ch1:#$0FA6; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN SUBJOINED LETTER BHA
  5658. (Unicode:#$0FAC; Attr:daNone; Ch1:#$0FAB; Ch2:#$0FB7; Ch3:#$FFFF), // TIBETAN SUBJOINED LETTER DZHA
  5659. (Unicode:#$0FB9; Attr:daNone; Ch1:#$0F90; Ch2:#$0FB5; Ch3:#$FFFF), // TIBETAN SUBJOINED LETTER KSSA
  5660. (Unicode:#$1026; Attr:daNone; Ch1:#$1025; Ch2:#$102E; Ch3:#$FFFF), // MYANMAR LETTER UU
  5661. (Unicode:#$1E00; Attr:daNone; Ch1:#$0041; Ch2:#$0325; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH RING BELOW
  5662. (Unicode:#$1E01; Attr:daNone; Ch1:#$0061; Ch2:#$0325; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH RING BELOW
  5663. (Unicode:#$1E02; Attr:daNone; Ch1:#$0042; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER B WITH DOT ABOVE
  5664. (Unicode:#$1E03; Attr:daNone; Ch1:#$0062; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER B WITH DOT ABOVE
  5665. (Unicode:#$1E04; Attr:daNone; Ch1:#$0042; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER B WITH DOT BELOW
  5666. (Unicode:#$1E05; Attr:daNone; Ch1:#$0062; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER B WITH DOT BELOW
  5667. (Unicode:#$1E06; Attr:daNone; Ch1:#$0042; Ch2:#$0331; Ch3:#$FFFF), // LATIN CAPITAL LETTER B WITH LINE BELOW
  5668. (Unicode:#$1E07; Attr:daNone; Ch1:#$0062; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER B WITH LINE BELOW
  5669. (Unicode:#$1E08; Attr:daNone; Ch1:#$00C7; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
  5670. (Unicode:#$1E09; Attr:daNone; Ch1:#$00E7; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
  5671. (Unicode:#$1E0A; Attr:daNone; Ch1:#$0044; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER D WITH DOT ABOVE
  5672. (Unicode:#$1E0B; Attr:daNone; Ch1:#$0064; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER D WITH DOT ABOVE
  5673. (Unicode:#$1E0C; Attr:daNone; Ch1:#$0044; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER D WITH DOT BELOW
  5674. (Unicode:#$1E0D; Attr:daNone; Ch1:#$0064; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER D WITH DOT BELOW
  5675. (Unicode:#$1E0E; Attr:daNone; Ch1:#$0044; Ch2:#$0331; Ch3:#$FFFF), // LATIN CAPITAL LETTER D WITH LINE BELOW
  5676. (Unicode:#$1E0F; Attr:daNone; Ch1:#$0064; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER D WITH LINE BELOW
  5677. (Unicode:#$1E10; Attr:daNone; Ch1:#$0044; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER D WITH CEDILLA
  5678. (Unicode:#$1E11; Attr:daNone; Ch1:#$0064; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER D WITH CEDILLA
  5679. (Unicode:#$1E12; Attr:daNone; Ch1:#$0044; Ch2:#$032D; Ch3:#$FFFF), // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
  5680. (Unicode:#$1E13; Attr:daNone; Ch1:#$0064; Ch2:#$032D; Ch3:#$FFFF), // LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
  5681. (Unicode:#$1E14; Attr:daNone; Ch1:#$0112; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
  5682. (Unicode:#$1E15; Attr:daNone; Ch1:#$0113; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH MACRON AND GRAVE
  5683. (Unicode:#$1E16; Attr:daNone; Ch1:#$0112; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
  5684. (Unicode:#$1E17; Attr:daNone; Ch1:#$0113; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH MACRON AND ACUTE
  5685. (Unicode:#$1E18; Attr:daNone; Ch1:#$0045; Ch2:#$032D; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
  5686. (Unicode:#$1E19; Attr:daNone; Ch1:#$0065; Ch2:#$032D; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
  5687. (Unicode:#$1E1A; Attr:daNone; Ch1:#$0045; Ch2:#$0330; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH TILDE BELOW
  5688. (Unicode:#$1E1B; Attr:daNone; Ch1:#$0065; Ch2:#$0330; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH TILDE BELOW
  5689. (Unicode:#$1E1C; Attr:daNone; Ch1:#$0228; Ch2:#$0306; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
  5690. (Unicode:#$1E1D; Attr:daNone; Ch1:#$0229; Ch2:#$0306; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CEDILLA AND BREVE
  5691. (Unicode:#$1E1E; Attr:daNone; Ch1:#$0046; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER F WITH DOT ABOVE
  5692. (Unicode:#$1E1F; Attr:daNone; Ch1:#$0066; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER F WITH DOT ABOVE
  5693. (Unicode:#$1E20; Attr:daNone; Ch1:#$0047; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER G WITH MACRON
  5694. (Unicode:#$1E21; Attr:daNone; Ch1:#$0067; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER G WITH MACRON
  5695. (Unicode:#$1E22; Attr:daNone; Ch1:#$0048; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER H WITH DOT ABOVE
  5696. (Unicode:#$1E23; Attr:daNone; Ch1:#$0068; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER H WITH DOT ABOVE
  5697. (Unicode:#$1E24; Attr:daNone; Ch1:#$0048; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER H WITH DOT BELOW
  5698. (Unicode:#$1E25; Attr:daNone; Ch1:#$0068; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER H WITH DOT BELOW
  5699. (Unicode:#$1E26; Attr:daNone; Ch1:#$0048; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER H WITH DIAERESIS
  5700. (Unicode:#$1E27; Attr:daNone; Ch1:#$0068; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER H WITH DIAERESIS
  5701. (Unicode:#$1E28; Attr:daNone; Ch1:#$0048; Ch2:#$0327; Ch3:#$FFFF), // LATIN CAPITAL LETTER H WITH CEDILLA
  5702. (Unicode:#$1E29; Attr:daNone; Ch1:#$0068; Ch2:#$0327; Ch3:#$FFFF), // LATIN SMALL LETTER H WITH CEDILLA
  5703. (Unicode:#$1E2A; Attr:daNone; Ch1:#$0048; Ch2:#$032E; Ch3:#$FFFF), // LATIN CAPITAL LETTER H WITH BREVE BELOW
  5704. (Unicode:#$1E2B; Attr:daNone; Ch1:#$0068; Ch2:#$032E; Ch3:#$FFFF), // LATIN SMALL LETTER H WITH BREVE BELOW
  5705. (Unicode:#$1E2C; Attr:daNone; Ch1:#$0049; Ch2:#$0330; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH TILDE BELOW
  5706. (Unicode:#$1E2D; Attr:daNone; Ch1:#$0069; Ch2:#$0330; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH TILDE BELOW
  5707. (Unicode:#$1E2E; Attr:daNone; Ch1:#$00CF; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
  5708. (Unicode:#$1E2F; Attr:daNone; Ch1:#$00EF; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
  5709. (Unicode:#$1E30; Attr:daNone; Ch1:#$004B; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER K WITH ACUTE
  5710. (Unicode:#$1E31; Attr:daNone; Ch1:#$006B; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER K WITH ACUTE
  5711. (Unicode:#$1E32; Attr:daNone; Ch1:#$004B; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER K WITH DOT BELOW
  5712. (Unicode:#$1E33; Attr:daNone; Ch1:#$006B; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER K WITH DOT BELOW
  5713. (Unicode:#$1E34; Attr:daNone; Ch1:#$004B; Ch2:#$0331; Ch3:#$FFFF), // LATIN CAPITAL LETTER K WITH LINE BELOW
  5714. (Unicode:#$1E35; Attr:daNone; Ch1:#$006B; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER K WITH LINE BELOW
  5715. (Unicode:#$1E36; Attr:daNone; Ch1:#$004C; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH DOT BELOW
  5716. (Unicode:#$1E37; Attr:daNone; Ch1:#$006C; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER L WITH DOT BELOW
  5717. (Unicode:#$1E38; Attr:daNone; Ch1:#$1E36; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
  5718. (Unicode:#$1E39; Attr:daNone; Ch1:#$1E37; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
  5719. (Unicode:#$1E3A; Attr:daNone; Ch1:#$004C; Ch2:#$0331; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH LINE BELOW
  5720. (Unicode:#$1E3B; Attr:daNone; Ch1:#$006C; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER L WITH LINE BELOW
  5721. (Unicode:#$1E3C; Attr:daNone; Ch1:#$004C; Ch2:#$032D; Ch3:#$FFFF), // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
  5722. (Unicode:#$1E3D; Attr:daNone; Ch1:#$006C; Ch2:#$032D; Ch3:#$FFFF), // LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
  5723. (Unicode:#$1E3E; Attr:daNone; Ch1:#$004D; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER M WITH ACUTE
  5724. (Unicode:#$1E3F; Attr:daNone; Ch1:#$006D; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER M WITH ACUTE
  5725. (Unicode:#$1E40; Attr:daNone; Ch1:#$004D; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER M WITH DOT ABOVE
  5726. (Unicode:#$1E41; Attr:daNone; Ch1:#$006D; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER M WITH DOT ABOVE
  5727. (Unicode:#$1E42; Attr:daNone; Ch1:#$004D; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER M WITH DOT BELOW
  5728. (Unicode:#$1E43; Attr:daNone; Ch1:#$006D; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER M WITH DOT BELOW
  5729. (Unicode:#$1E44; Attr:daNone; Ch1:#$004E; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH DOT ABOVE
  5730. (Unicode:#$1E45; Attr:daNone; Ch1:#$006E; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH DOT ABOVE
  5731. (Unicode:#$1E46; Attr:daNone; Ch1:#$004E; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH DOT BELOW
  5732. (Unicode:#$1E47; Attr:daNone; Ch1:#$006E; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH DOT BELOW
  5733. (Unicode:#$1E48; Attr:daNone; Ch1:#$004E; Ch2:#$0331; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH LINE BELOW
  5734. (Unicode:#$1E49; Attr:daNone; Ch1:#$006E; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH LINE BELOW
  5735. (Unicode:#$1E4A; Attr:daNone; Ch1:#$004E; Ch2:#$032D; Ch3:#$FFFF), // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
  5736. (Unicode:#$1E4B; Attr:daNone; Ch1:#$006E; Ch2:#$032D; Ch3:#$FFFF), // LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
  5737. (Unicode:#$1E4C; Attr:daNone; Ch1:#$00D5; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
  5738. (Unicode:#$1E4D; Attr:daNone; Ch1:#$00F5; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH TILDE AND ACUTE
  5739. (Unicode:#$1E4E; Attr:daNone; Ch1:#$00D5; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
  5740. (Unicode:#$1E4F; Attr:daNone; Ch1:#$00F5; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
  5741. (Unicode:#$1E50; Attr:daNone; Ch1:#$014C; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
  5742. (Unicode:#$1E51; Attr:daNone; Ch1:#$014D; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH MACRON AND GRAVE
  5743. (Unicode:#$1E52; Attr:daNone; Ch1:#$014C; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
  5744. (Unicode:#$1E53; Attr:daNone; Ch1:#$014D; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH MACRON AND ACUTE
  5745. (Unicode:#$1E54; Attr:daNone; Ch1:#$0050; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER P WITH ACUTE
  5746. (Unicode:#$1E55; Attr:daNone; Ch1:#$0070; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER P WITH ACUTE
  5747. (Unicode:#$1E56; Attr:daNone; Ch1:#$0050; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER P WITH DOT ABOVE
  5748. (Unicode:#$1E57; Attr:daNone; Ch1:#$0070; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER P WITH DOT ABOVE
  5749. (Unicode:#$1E58; Attr:daNone; Ch1:#$0052; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH DOT ABOVE
  5750. (Unicode:#$1E59; Attr:daNone; Ch1:#$0072; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH DOT ABOVE
  5751. (Unicode:#$1E5A; Attr:daNone; Ch1:#$0052; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH DOT BELOW
  5752. (Unicode:#$1E5B; Attr:daNone; Ch1:#$0072; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH DOT BELOW
  5753. (Unicode:#$1E5C; Attr:daNone; Ch1:#$1E5A; Ch2:#$0304; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
  5754. (Unicode:#$1E5D; Attr:daNone; Ch1:#$1E5B; Ch2:#$0304; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
  5755. (Unicode:#$1E5E; Attr:daNone; Ch1:#$0052; Ch2:#$0331; Ch3:#$FFFF), // LATIN CAPITAL LETTER R WITH LINE BELOW
  5756. (Unicode:#$1E5F; Attr:daNone; Ch1:#$0072; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER R WITH LINE BELOW
  5757. (Unicode:#$1E60; Attr:daNone; Ch1:#$0053; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH DOT ABOVE
  5758. (Unicode:#$1E61; Attr:daNone; Ch1:#$0073; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH DOT ABOVE
  5759. (Unicode:#$1E62; Attr:daNone; Ch1:#$0053; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH DOT BELOW
  5760. (Unicode:#$1E63; Attr:daNone; Ch1:#$0073; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH DOT BELOW
  5761. (Unicode:#$1E64; Attr:daNone; Ch1:#$015A; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
  5762. (Unicode:#$1E65; Attr:daNone; Ch1:#$015B; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
  5763. (Unicode:#$1E66; Attr:daNone; Ch1:#$0160; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
  5764. (Unicode:#$1E67; Attr:daNone; Ch1:#$0161; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
  5765. (Unicode:#$1E68; Attr:daNone; Ch1:#$1E62; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
  5766. (Unicode:#$1E69; Attr:daNone; Ch1:#$1E63; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
  5767. (Unicode:#$1E6A; Attr:daNone; Ch1:#$0054; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER T WITH DOT ABOVE
  5768. (Unicode:#$1E6B; Attr:daNone; Ch1:#$0074; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER T WITH DOT ABOVE
  5769. (Unicode:#$1E6C; Attr:daNone; Ch1:#$0054; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER T WITH DOT BELOW
  5770. (Unicode:#$1E6D; Attr:daNone; Ch1:#$0074; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER T WITH DOT BELOW
  5771. (Unicode:#$1E6E; Attr:daNone; Ch1:#$0054; Ch2:#$0331; Ch3:#$FFFF), // LATIN CAPITAL LETTER T WITH LINE BELOW
  5772. (Unicode:#$1E6F; Attr:daNone; Ch1:#$0074; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER T WITH LINE BELOW
  5773. (Unicode:#$1E70; Attr:daNone; Ch1:#$0054; Ch2:#$032D; Ch3:#$FFFF), // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
  5774. (Unicode:#$1E71; Attr:daNone; Ch1:#$0074; Ch2:#$032D; Ch3:#$FFFF), // LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
  5775. (Unicode:#$1E72; Attr:daNone; Ch1:#$0055; Ch2:#$0324; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
  5776. (Unicode:#$1E73; Attr:daNone; Ch1:#$0075; Ch2:#$0324; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DIAERESIS BELOW
  5777. (Unicode:#$1E74; Attr:daNone; Ch1:#$0055; Ch2:#$0330; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH TILDE BELOW
  5778. (Unicode:#$1E75; Attr:daNone; Ch1:#$0075; Ch2:#$0330; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH TILDE BELOW
  5779. (Unicode:#$1E76; Attr:daNone; Ch1:#$0055; Ch2:#$032D; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
  5780. (Unicode:#$1E77; Attr:daNone; Ch1:#$0075; Ch2:#$032D; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
  5781. (Unicode:#$1E78; Attr:daNone; Ch1:#$0168; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
  5782. (Unicode:#$1E79; Attr:daNone; Ch1:#$0169; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH TILDE AND ACUTE
  5783. (Unicode:#$1E7A; Attr:daNone; Ch1:#$016A; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
  5784. (Unicode:#$1E7B; Attr:daNone; Ch1:#$016B; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
  5785. (Unicode:#$1E7C; Attr:daNone; Ch1:#$0056; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER V WITH TILDE
  5786. (Unicode:#$1E7D; Attr:daNone; Ch1:#$0076; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER V WITH TILDE
  5787. (Unicode:#$1E7E; Attr:daNone; Ch1:#$0056; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER V WITH DOT BELOW
  5788. (Unicode:#$1E7F; Attr:daNone; Ch1:#$0076; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER V WITH DOT BELOW
  5789. (Unicode:#$1E80; Attr:daNone; Ch1:#$0057; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER W WITH GRAVE
  5790. (Unicode:#$1E81; Attr:daNone; Ch1:#$0077; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER W WITH GRAVE
  5791. (Unicode:#$1E82; Attr:daNone; Ch1:#$0057; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER W WITH ACUTE
  5792. (Unicode:#$1E83; Attr:daNone; Ch1:#$0077; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER W WITH ACUTE
  5793. (Unicode:#$1E84; Attr:daNone; Ch1:#$0057; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER W WITH DIAERESIS
  5794. (Unicode:#$1E85; Attr:daNone; Ch1:#$0077; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER W WITH DIAERESIS
  5795. (Unicode:#$1E86; Attr:daNone; Ch1:#$0057; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER W WITH DOT ABOVE
  5796. (Unicode:#$1E87; Attr:daNone; Ch1:#$0077; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER W WITH DOT ABOVE
  5797. (Unicode:#$1E88; Attr:daNone; Ch1:#$0057; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER W WITH DOT BELOW
  5798. (Unicode:#$1E89; Attr:daNone; Ch1:#$0077; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER W WITH DOT BELOW
  5799. (Unicode:#$1E8A; Attr:daNone; Ch1:#$0058; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER X WITH DOT ABOVE
  5800. (Unicode:#$1E8B; Attr:daNone; Ch1:#$0078; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER X WITH DOT ABOVE
  5801. (Unicode:#$1E8C; Attr:daNone; Ch1:#$0058; Ch2:#$0308; Ch3:#$FFFF), // LATIN CAPITAL LETTER X WITH DIAERESIS
  5802. (Unicode:#$1E8D; Attr:daNone; Ch1:#$0078; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER X WITH DIAERESIS
  5803. (Unicode:#$1E8E; Attr:daNone; Ch1:#$0059; Ch2:#$0307; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH DOT ABOVE
  5804. (Unicode:#$1E8F; Attr:daNone; Ch1:#$0079; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH DOT ABOVE
  5805. (Unicode:#$1E90; Attr:daNone; Ch1:#$005A; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
  5806. (Unicode:#$1E91; Attr:daNone; Ch1:#$007A; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER Z WITH CIRCUMFLEX
  5807. (Unicode:#$1E92; Attr:daNone; Ch1:#$005A; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER Z WITH DOT BELOW
  5808. (Unicode:#$1E93; Attr:daNone; Ch1:#$007A; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER Z WITH DOT BELOW
  5809. (Unicode:#$1E94; Attr:daNone; Ch1:#$005A; Ch2:#$0331; Ch3:#$FFFF), // LATIN CAPITAL LETTER Z WITH LINE BELOW
  5810. (Unicode:#$1E95; Attr:daNone; Ch1:#$007A; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER Z WITH LINE BELOW
  5811. (Unicode:#$1E96; Attr:daNone; Ch1:#$0068; Ch2:#$0331; Ch3:#$FFFF), // LATIN SMALL LETTER H WITH LINE BELOW
  5812. (Unicode:#$1E97; Attr:daNone; Ch1:#$0074; Ch2:#$0308; Ch3:#$FFFF), // LATIN SMALL LETTER T WITH DIAERESIS
  5813. (Unicode:#$1E98; Attr:daNone; Ch1:#$0077; Ch2:#$030A; Ch3:#$FFFF), // LATIN SMALL LETTER W WITH RING ABOVE
  5814. (Unicode:#$1E99; Attr:daNone; Ch1:#$0079; Ch2:#$030A; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH RING ABOVE
  5815. (Unicode:#$1E9A; Attr:daCompat; Ch1:#$0061; Ch2:#$02BE; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH RIGHT HALF RING
  5816. (Unicode:#$1E9B; Attr:daNone; Ch1:#$017F; Ch2:#$0307; Ch3:#$FFFF), // LATIN SMALL LETTER LONG S WITH DOT ABOVE
  5817. (Unicode:#$1EA0; Attr:daNone; Ch1:#$0041; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH DOT BELOW
  5818. (Unicode:#$1EA1; Attr:daNone; Ch1:#$0061; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH DOT BELOW
  5819. (Unicode:#$1EA2; Attr:daNone; Ch1:#$0041; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH HOOK ABOVE
  5820. (Unicode:#$1EA3; Attr:daNone; Ch1:#$0061; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH HOOK ABOVE
  5821. (Unicode:#$1EA4; Attr:daNone; Ch1:#$00C2; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
  5822. (Unicode:#$1EA5; Attr:daNone; Ch1:#$00E2; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
  5823. (Unicode:#$1EA6; Attr:daNone; Ch1:#$00C2; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
  5824. (Unicode:#$1EA7; Attr:daNone; Ch1:#$00E2; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
  5825. (Unicode:#$1EA8; Attr:daNone; Ch1:#$00C2; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
  5826. (Unicode:#$1EA9; Attr:daNone; Ch1:#$00E2; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
  5827. (Unicode:#$1EAA; Attr:daNone; Ch1:#$00C2; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
  5828. (Unicode:#$1EAB; Attr:daNone; Ch1:#$00E2; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
  5829. (Unicode:#$1EAC; Attr:daNone; Ch1:#$1EA0; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
  5830. (Unicode:#$1EAD; Attr:daNone; Ch1:#$1EA1; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
  5831. (Unicode:#$1EAE; Attr:daNone; Ch1:#$0102; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
  5832. (Unicode:#$1EAF; Attr:daNone; Ch1:#$0103; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH BREVE AND ACUTE
  5833. (Unicode:#$1EB0; Attr:daNone; Ch1:#$0102; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
  5834. (Unicode:#$1EB1; Attr:daNone; Ch1:#$0103; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH BREVE AND GRAVE
  5835. (Unicode:#$1EB2; Attr:daNone; Ch1:#$0102; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
  5836. (Unicode:#$1EB3; Attr:daNone; Ch1:#$0103; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
  5837. (Unicode:#$1EB4; Attr:daNone; Ch1:#$0102; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH BREVE AND TILDE
  5838. (Unicode:#$1EB5; Attr:daNone; Ch1:#$0103; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH BREVE AND TILDE
  5839. (Unicode:#$1EB6; Attr:daNone; Ch1:#$1EA0; Ch2:#$0306; Ch3:#$FFFF), // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
  5840. (Unicode:#$1EB7; Attr:daNone; Ch1:#$1EA1; Ch2:#$0306; Ch3:#$FFFF), // LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
  5841. (Unicode:#$1EB8; Attr:daNone; Ch1:#$0045; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH DOT BELOW
  5842. (Unicode:#$1EB9; Attr:daNone; Ch1:#$0065; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH DOT BELOW
  5843. (Unicode:#$1EBA; Attr:daNone; Ch1:#$0045; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH HOOK ABOVE
  5844. (Unicode:#$1EBB; Attr:daNone; Ch1:#$0065; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH HOOK ABOVE
  5845. (Unicode:#$1EBC; Attr:daNone; Ch1:#$0045; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH TILDE
  5846. (Unicode:#$1EBD; Attr:daNone; Ch1:#$0065; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH TILDE
  5847. (Unicode:#$1EBE; Attr:daNone; Ch1:#$00CA; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
  5848. (Unicode:#$1EBF; Attr:daNone; Ch1:#$00EA; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
  5849. (Unicode:#$1EC0; Attr:daNone; Ch1:#$00CA; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
  5850. (Unicode:#$1EC1; Attr:daNone; Ch1:#$00EA; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
  5851. (Unicode:#$1EC2; Attr:daNone; Ch1:#$00CA; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
  5852. (Unicode:#$1EC3; Attr:daNone; Ch1:#$00EA; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
  5853. (Unicode:#$1EC4; Attr:daNone; Ch1:#$00CA; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
  5854. (Unicode:#$1EC5; Attr:daNone; Ch1:#$00EA; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
  5855. (Unicode:#$1EC6; Attr:daNone; Ch1:#$1EB8; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
  5856. (Unicode:#$1EC7; Attr:daNone; Ch1:#$1EB9; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
  5857. (Unicode:#$1EC8; Attr:daNone; Ch1:#$0049; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH HOOK ABOVE
  5858. (Unicode:#$1EC9; Attr:daNone; Ch1:#$0069; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH HOOK ABOVE
  5859. (Unicode:#$1ECA; Attr:daNone; Ch1:#$0049; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER I WITH DOT BELOW
  5860. (Unicode:#$1ECB; Attr:daNone; Ch1:#$0069; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER I WITH DOT BELOW
  5861. (Unicode:#$1ECC; Attr:daNone; Ch1:#$004F; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH DOT BELOW
  5862. (Unicode:#$1ECD; Attr:daNone; Ch1:#$006F; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH DOT BELOW
  5863. (Unicode:#$1ECE; Attr:daNone; Ch1:#$004F; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH HOOK ABOVE
  5864. (Unicode:#$1ECF; Attr:daNone; Ch1:#$006F; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH HOOK ABOVE
  5865. (Unicode:#$1ED0; Attr:daNone; Ch1:#$00D4; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
  5866. (Unicode:#$1ED1; Attr:daNone; Ch1:#$00F4; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
  5867. (Unicode:#$1ED2; Attr:daNone; Ch1:#$00D4; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
  5868. (Unicode:#$1ED3; Attr:daNone; Ch1:#$00F4; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
  5869. (Unicode:#$1ED4; Attr:daNone; Ch1:#$00D4; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
  5870. (Unicode:#$1ED5; Attr:daNone; Ch1:#$00F4; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
  5871. (Unicode:#$1ED6; Attr:daNone; Ch1:#$00D4; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
  5872. (Unicode:#$1ED7; Attr:daNone; Ch1:#$00F4; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
  5873. (Unicode:#$1ED8; Attr:daNone; Ch1:#$1ECC; Ch2:#$0302; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
  5874. (Unicode:#$1ED9; Attr:daNone; Ch1:#$1ECD; Ch2:#$0302; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
  5875. (Unicode:#$1EDA; Attr:daNone; Ch1:#$01A0; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH HORN AND ACUTE
  5876. (Unicode:#$1EDB; Attr:daNone; Ch1:#$01A1; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH HORN AND ACUTE
  5877. (Unicode:#$1EDC; Attr:daNone; Ch1:#$01A0; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH HORN AND GRAVE
  5878. (Unicode:#$1EDD; Attr:daNone; Ch1:#$01A1; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH HORN AND GRAVE
  5879. (Unicode:#$1EDE; Attr:daNone; Ch1:#$01A0; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
  5880. (Unicode:#$1EDF; Attr:daNone; Ch1:#$01A1; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
  5881. (Unicode:#$1EE0; Attr:daNone; Ch1:#$01A0; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH HORN AND TILDE
  5882. (Unicode:#$1EE1; Attr:daNone; Ch1:#$01A1; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH HORN AND TILDE
  5883. (Unicode:#$1EE2; Attr:daNone; Ch1:#$01A0; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
  5884. (Unicode:#$1EE3; Attr:daNone; Ch1:#$01A1; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER O WITH HORN AND DOT BELOW
  5885. (Unicode:#$1EE4; Attr:daNone; Ch1:#$0055; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH DOT BELOW
  5886. (Unicode:#$1EE5; Attr:daNone; Ch1:#$0075; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH DOT BELOW
  5887. (Unicode:#$1EE6; Attr:daNone; Ch1:#$0055; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH HOOK ABOVE
  5888. (Unicode:#$1EE7; Attr:daNone; Ch1:#$0075; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH HOOK ABOVE
  5889. (Unicode:#$1EE8; Attr:daNone; Ch1:#$01AF; Ch2:#$0301; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH HORN AND ACUTE
  5890. (Unicode:#$1EE9; Attr:daNone; Ch1:#$01B0; Ch2:#$0301; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH HORN AND ACUTE
  5891. (Unicode:#$1EEA; Attr:daNone; Ch1:#$01AF; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH HORN AND GRAVE
  5892. (Unicode:#$1EEB; Attr:daNone; Ch1:#$01B0; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH HORN AND GRAVE
  5893. (Unicode:#$1EEC; Attr:daNone; Ch1:#$01AF; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
  5894. (Unicode:#$1EED; Attr:daNone; Ch1:#$01B0; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
  5895. (Unicode:#$1EEE; Attr:daNone; Ch1:#$01AF; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH HORN AND TILDE
  5896. (Unicode:#$1EEF; Attr:daNone; Ch1:#$01B0; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH HORN AND TILDE
  5897. (Unicode:#$1EF0; Attr:daNone; Ch1:#$01AF; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
  5898. (Unicode:#$1EF1; Attr:daNone; Ch1:#$01B0; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER U WITH HORN AND DOT BELOW
  5899. (Unicode:#$1EF2; Attr:daNone; Ch1:#$0059; Ch2:#$0300; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH GRAVE
  5900. (Unicode:#$1EF3; Attr:daNone; Ch1:#$0079; Ch2:#$0300; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH GRAVE
  5901. (Unicode:#$1EF4; Attr:daNone; Ch1:#$0059; Ch2:#$0323; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH DOT BELOW
  5902. (Unicode:#$1EF5; Attr:daNone; Ch1:#$0079; Ch2:#$0323; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH DOT BELOW
  5903. (Unicode:#$1EF6; Attr:daNone; Ch1:#$0059; Ch2:#$0309; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH HOOK ABOVE
  5904. (Unicode:#$1EF7; Attr:daNone; Ch1:#$0079; Ch2:#$0309; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH HOOK ABOVE
  5905. (Unicode:#$1EF8; Attr:daNone; Ch1:#$0059; Ch2:#$0303; Ch3:#$FFFF), // LATIN CAPITAL LETTER Y WITH TILDE
  5906. (Unicode:#$1EF9; Attr:daNone; Ch1:#$0079; Ch2:#$0303; Ch3:#$FFFF), // LATIN SMALL LETTER Y WITH TILDE
  5907. (Unicode:#$1F00; Attr:daNone; Ch1:#$03B1; Ch2:#$0313; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PSILI
  5908. (Unicode:#$1F01; Attr:daNone; Ch1:#$03B1; Ch2:#$0314; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH DASIA
  5909. (Unicode:#$1F02; Attr:daNone; Ch1:#$1F00; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
  5910. (Unicode:#$1F03; Attr:daNone; Ch1:#$1F01; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
  5911. (Unicode:#$1F04; Attr:daNone; Ch1:#$1F00; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
  5912. (Unicode:#$1F05; Attr:daNone; Ch1:#$1F01; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
  5913. (Unicode:#$1F06; Attr:daNone; Ch1:#$1F00; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
  5914. (Unicode:#$1F07; Attr:daNone; Ch1:#$1F01; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
  5915. (Unicode:#$1F08; Attr:daNone; Ch1:#$0391; Ch2:#$0313; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PSILI
  5916. (Unicode:#$1F09; Attr:daNone; Ch1:#$0391; Ch2:#$0314; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH DASIA
  5917. (Unicode:#$1F0A; Attr:daNone; Ch1:#$1F08; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
  5918. (Unicode:#$1F0B; Attr:daNone; Ch1:#$1F09; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
  5919. (Unicode:#$1F0C; Attr:daNone; Ch1:#$1F08; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
  5920. (Unicode:#$1F0D; Attr:daNone; Ch1:#$1F09; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
  5921. (Unicode:#$1F0E; Attr:daNone; Ch1:#$1F08; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
  5922. (Unicode:#$1F0F; Attr:daNone; Ch1:#$1F09; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
  5923. (Unicode:#$1F10; Attr:daNone; Ch1:#$03B5; Ch2:#$0313; Ch3:#$FFFF), // GREEK SMALL LETTER EPSILON WITH PSILI
  5924. (Unicode:#$1F11; Attr:daNone; Ch1:#$03B5; Ch2:#$0314; Ch3:#$FFFF), // GREEK SMALL LETTER EPSILON WITH DASIA
  5925. (Unicode:#$1F12; Attr:daNone; Ch1:#$1F10; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
  5926. (Unicode:#$1F13; Attr:daNone; Ch1:#$1F11; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
  5927. (Unicode:#$1F14; Attr:daNone; Ch1:#$1F10; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
  5928. (Unicode:#$1F15; Attr:daNone; Ch1:#$1F11; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
  5929. (Unicode:#$1F18; Attr:daNone; Ch1:#$0395; Ch2:#$0313; Ch3:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH PSILI
  5930. (Unicode:#$1F19; Attr:daNone; Ch1:#$0395; Ch2:#$0314; Ch3:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH DASIA
  5931. (Unicode:#$1F1A; Attr:daNone; Ch1:#$1F18; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
  5932. (Unicode:#$1F1B; Attr:daNone; Ch1:#$1F19; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
  5933. (Unicode:#$1F1C; Attr:daNone; Ch1:#$1F18; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
  5934. (Unicode:#$1F1D; Attr:daNone; Ch1:#$1F19; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
  5935. (Unicode:#$1F20; Attr:daNone; Ch1:#$03B7; Ch2:#$0313; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PSILI
  5936. (Unicode:#$1F21; Attr:daNone; Ch1:#$03B7; Ch2:#$0314; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH DASIA
  5937. (Unicode:#$1F22; Attr:daNone; Ch1:#$1F20; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PSILI AND VARIA
  5938. (Unicode:#$1F23; Attr:daNone; Ch1:#$1F21; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH DASIA AND VARIA
  5939. (Unicode:#$1F24; Attr:daNone; Ch1:#$1F20; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PSILI AND OXIA
  5940. (Unicode:#$1F25; Attr:daNone; Ch1:#$1F21; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH DASIA AND OXIA
  5941. (Unicode:#$1F26; Attr:daNone; Ch1:#$1F20; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
  5942. (Unicode:#$1F27; Attr:daNone; Ch1:#$1F21; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
  5943. (Unicode:#$1F28; Attr:daNone; Ch1:#$0397; Ch2:#$0313; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PSILI
  5944. (Unicode:#$1F29; Attr:daNone; Ch1:#$0397; Ch2:#$0314; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH DASIA
  5945. (Unicode:#$1F2A; Attr:daNone; Ch1:#$1F28; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
  5946. (Unicode:#$1F2B; Attr:daNone; Ch1:#$1F29; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
  5947. (Unicode:#$1F2C; Attr:daNone; Ch1:#$1F28; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
  5948. (Unicode:#$1F2D; Attr:daNone; Ch1:#$1F29; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
  5949. (Unicode:#$1F2E; Attr:daNone; Ch1:#$1F28; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
  5950. (Unicode:#$1F2F; Attr:daNone; Ch1:#$1F29; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
  5951. (Unicode:#$1F30; Attr:daNone; Ch1:#$03B9; Ch2:#$0313; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH PSILI
  5952. (Unicode:#$1F31; Attr:daNone; Ch1:#$03B9; Ch2:#$0314; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH DASIA
  5953. (Unicode:#$1F32; Attr:daNone; Ch1:#$1F30; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
  5954. (Unicode:#$1F33; Attr:daNone; Ch1:#$1F31; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
  5955. (Unicode:#$1F34; Attr:daNone; Ch1:#$1F30; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
  5956. (Unicode:#$1F35; Attr:daNone; Ch1:#$1F31; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
  5957. (Unicode:#$1F36; Attr:daNone; Ch1:#$1F30; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
  5958. (Unicode:#$1F37; Attr:daNone; Ch1:#$1F31; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
  5959. (Unicode:#$1F38; Attr:daNone; Ch1:#$0399; Ch2:#$0313; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH PSILI
  5960. (Unicode:#$1F39; Attr:daNone; Ch1:#$0399; Ch2:#$0314; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH DASIA
  5961. (Unicode:#$1F3A; Attr:daNone; Ch1:#$1F38; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
  5962. (Unicode:#$1F3B; Attr:daNone; Ch1:#$1F39; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
  5963. (Unicode:#$1F3C; Attr:daNone; Ch1:#$1F38; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
  5964. (Unicode:#$1F3D; Attr:daNone; Ch1:#$1F39; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
  5965. (Unicode:#$1F3E; Attr:daNone; Ch1:#$1F38; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
  5966. (Unicode:#$1F3F; Attr:daNone; Ch1:#$1F39; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
  5967. (Unicode:#$1F40; Attr:daNone; Ch1:#$03BF; Ch2:#$0313; Ch3:#$FFFF), // GREEK SMALL LETTER OMICRON WITH PSILI
  5968. (Unicode:#$1F41; Attr:daNone; Ch1:#$03BF; Ch2:#$0314; Ch3:#$FFFF), // GREEK SMALL LETTER OMICRON WITH DASIA
  5969. (Unicode:#$1F42; Attr:daNone; Ch1:#$1F40; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
  5970. (Unicode:#$1F43; Attr:daNone; Ch1:#$1F41; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
  5971. (Unicode:#$1F44; Attr:daNone; Ch1:#$1F40; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
  5972. (Unicode:#$1F45; Attr:daNone; Ch1:#$1F41; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
  5973. (Unicode:#$1F48; Attr:daNone; Ch1:#$039F; Ch2:#$0313; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH PSILI
  5974. (Unicode:#$1F49; Attr:daNone; Ch1:#$039F; Ch2:#$0314; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH DASIA
  5975. (Unicode:#$1F4A; Attr:daNone; Ch1:#$1F48; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
  5976. (Unicode:#$1F4B; Attr:daNone; Ch1:#$1F49; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
  5977. (Unicode:#$1F4C; Attr:daNone; Ch1:#$1F48; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
  5978. (Unicode:#$1F4D; Attr:daNone; Ch1:#$1F49; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
  5979. (Unicode:#$1F50; Attr:daNone; Ch1:#$03C5; Ch2:#$0313; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PSILI
  5980. (Unicode:#$1F51; Attr:daNone; Ch1:#$03C5; Ch2:#$0314; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DASIA
  5981. (Unicode:#$1F52; Attr:daNone; Ch1:#$1F50; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
  5982. (Unicode:#$1F53; Attr:daNone; Ch1:#$1F51; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
  5983. (Unicode:#$1F54; Attr:daNone; Ch1:#$1F50; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
  5984. (Unicode:#$1F55; Attr:daNone; Ch1:#$1F51; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
  5985. (Unicode:#$1F56; Attr:daNone; Ch1:#$1F50; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
  5986. (Unicode:#$1F57; Attr:daNone; Ch1:#$1F51; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
  5987. (Unicode:#$1F59; Attr:daNone; Ch1:#$03A5; Ch2:#$0314; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH DASIA
  5988. (Unicode:#$1F5B; Attr:daNone; Ch1:#$1F59; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
  5989. (Unicode:#$1F5D; Attr:daNone; Ch1:#$1F59; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
  5990. (Unicode:#$1F5F; Attr:daNone; Ch1:#$1F59; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
  5991. (Unicode:#$1F60; Attr:daNone; Ch1:#$03C9; Ch2:#$0313; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PSILI
  5992. (Unicode:#$1F61; Attr:daNone; Ch1:#$03C9; Ch2:#$0314; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH DASIA
  5993. (Unicode:#$1F62; Attr:daNone; Ch1:#$1F60; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
  5994. (Unicode:#$1F63; Attr:daNone; Ch1:#$1F61; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
  5995. (Unicode:#$1F64; Attr:daNone; Ch1:#$1F60; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
  5996. (Unicode:#$1F65; Attr:daNone; Ch1:#$1F61; Ch2:#$0301; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
  5997. (Unicode:#$1F66; Attr:daNone; Ch1:#$1F60; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
  5998. (Unicode:#$1F67; Attr:daNone; Ch1:#$1F61; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
  5999. (Unicode:#$1F68; Attr:daNone; Ch1:#$03A9; Ch2:#$0313; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PSILI
  6000. (Unicode:#$1F69; Attr:daNone; Ch1:#$03A9; Ch2:#$0314; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH DASIA
  6001. (Unicode:#$1F6A; Attr:daNone; Ch1:#$1F68; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
  6002. (Unicode:#$1F6B; Attr:daNone; Ch1:#$1F69; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
  6003. (Unicode:#$1F6C; Attr:daNone; Ch1:#$1F68; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
  6004. (Unicode:#$1F6D; Attr:daNone; Ch1:#$1F69; Ch2:#$0301; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
  6005. (Unicode:#$1F6E; Attr:daNone; Ch1:#$1F68; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
  6006. (Unicode:#$1F6F; Attr:daNone; Ch1:#$1F69; Ch2:#$0342; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
  6007. (Unicode:#$1F70; Attr:daNone; Ch1:#$03B1; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH VARIA
  6008. (Unicode:#$1F71; Attr:daNone; Ch1:#$03AC; Ch2:#$FFFF), // GREEK SMALL LETTER ALPHA WITH OXIA
  6009. (Unicode:#$1F72; Attr:daNone; Ch1:#$03B5; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER EPSILON WITH VARIA
  6010. (Unicode:#$1F73; Attr:daNone; Ch1:#$03AD; Ch2:#$FFFF), // GREEK SMALL LETTER EPSILON WITH OXIA
  6011. (Unicode:#$1F74; Attr:daNone; Ch1:#$03B7; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH VARIA
  6012. (Unicode:#$1F75; Attr:daNone; Ch1:#$03AE; Ch2:#$FFFF), // GREEK SMALL LETTER ETA WITH OXIA
  6013. (Unicode:#$1F76; Attr:daNone; Ch1:#$03B9; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH VARIA
  6014. (Unicode:#$1F77; Attr:daNone; Ch1:#$03AF; Ch2:#$FFFF), // GREEK SMALL LETTER IOTA WITH OXIA
  6015. (Unicode:#$1F78; Attr:daNone; Ch1:#$03BF; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER OMICRON WITH VARIA
  6016. (Unicode:#$1F79; Attr:daNone; Ch1:#$03CC; Ch2:#$FFFF), // GREEK SMALL LETTER OMICRON WITH OXIA
  6017. (Unicode:#$1F7A; Attr:daNone; Ch1:#$03C5; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH VARIA
  6018. (Unicode:#$1F7B; Attr:daNone; Ch1:#$03CD; Ch2:#$FFFF), // GREEK SMALL LETTER UPSILON WITH OXIA
  6019. (Unicode:#$1F7C; Attr:daNone; Ch1:#$03C9; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH VARIA
  6020. (Unicode:#$1F7D; Attr:daNone; Ch1:#$03CE; Ch2:#$FFFF), // GREEK SMALL LETTER OMEGA WITH OXIA
  6021. (Unicode:#$1F80; Attr:daNone; Ch1:#$1F00; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
  6022. (Unicode:#$1F81; Attr:daNone; Ch1:#$1F01; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
  6023. (Unicode:#$1F82; Attr:daNone; Ch1:#$1F02; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  6024. (Unicode:#$1F83; Attr:daNone; Ch1:#$1F03; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  6025. (Unicode:#$1F84; Attr:daNone; Ch1:#$1F04; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  6026. (Unicode:#$1F85; Attr:daNone; Ch1:#$1F05; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  6027. (Unicode:#$1F86; Attr:daNone; Ch1:#$1F06; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  6028. (Unicode:#$1F87; Attr:daNone; Ch1:#$1F07; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  6029. (Unicode:#$1F88; Attr:daNone; Ch1:#$1F08; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
  6030. (Unicode:#$1F89; Attr:daNone; Ch1:#$1F09; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
  6031. (Unicode:#$1F8A; Attr:daNone; Ch1:#$1F0A; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  6032. (Unicode:#$1F8B; Attr:daNone; Ch1:#$1F0B; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  6033. (Unicode:#$1F8C; Attr:daNone; Ch1:#$1F0C; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  6034. (Unicode:#$1F8D; Attr:daNone; Ch1:#$1F0D; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  6035. (Unicode:#$1F8E; Attr:daNone; Ch1:#$1F0E; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  6036. (Unicode:#$1F8F; Attr:daNone; Ch1:#$1F0F; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  6037. (Unicode:#$1F90; Attr:daNone; Ch1:#$1F20; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
  6038. (Unicode:#$1F91; Attr:daNone; Ch1:#$1F21; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
  6039. (Unicode:#$1F92; Attr:daNone; Ch1:#$1F22; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  6040. (Unicode:#$1F93; Attr:daNone; Ch1:#$1F23; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  6041. (Unicode:#$1F94; Attr:daNone; Ch1:#$1F24; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  6042. (Unicode:#$1F95; Attr:daNone; Ch1:#$1F25; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  6043. (Unicode:#$1F96; Attr:daNone; Ch1:#$1F26; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  6044. (Unicode:#$1F97; Attr:daNone; Ch1:#$1F27; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  6045. (Unicode:#$1F98; Attr:daNone; Ch1:#$1F28; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
  6046. (Unicode:#$1F99; Attr:daNone; Ch1:#$1F29; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
  6047. (Unicode:#$1F9A; Attr:daNone; Ch1:#$1F2A; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  6048. (Unicode:#$1F9B; Attr:daNone; Ch1:#$1F2B; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  6049. (Unicode:#$1F9C; Attr:daNone; Ch1:#$1F2C; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  6050. (Unicode:#$1F9D; Attr:daNone; Ch1:#$1F2D; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  6051. (Unicode:#$1F9E; Attr:daNone; Ch1:#$1F2E; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  6052. (Unicode:#$1F9F; Attr:daNone; Ch1:#$1F2F; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  6053. (Unicode:#$1FA0; Attr:daNone; Ch1:#$1F60; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
  6054. (Unicode:#$1FA1; Attr:daNone; Ch1:#$1F61; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
  6055. (Unicode:#$1FA2; Attr:daNone; Ch1:#$1F62; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
  6056. (Unicode:#$1FA3; Attr:daNone; Ch1:#$1F63; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
  6057. (Unicode:#$1FA4; Attr:daNone; Ch1:#$1F64; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
  6058. (Unicode:#$1FA5; Attr:daNone; Ch1:#$1F65; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
  6059. (Unicode:#$1FA6; Attr:daNone; Ch1:#$1F66; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
  6060. (Unicode:#$1FA7; Attr:daNone; Ch1:#$1F67; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
  6061. (Unicode:#$1FA8; Attr:daNone; Ch1:#$1F68; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
  6062. (Unicode:#$1FA9; Attr:daNone; Ch1:#$1F69; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
  6063. (Unicode:#$1FAA; Attr:daNone; Ch1:#$1F6A; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
  6064. (Unicode:#$1FAB; Attr:daNone; Ch1:#$1F6B; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
  6065. (Unicode:#$1FAC; Attr:daNone; Ch1:#$1F6C; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
  6066. (Unicode:#$1FAD; Attr:daNone; Ch1:#$1F6D; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
  6067. (Unicode:#$1FAE; Attr:daNone; Ch1:#$1F6E; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
  6068. (Unicode:#$1FAF; Attr:daNone; Ch1:#$1F6F; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
  6069. (Unicode:#$1FB0; Attr:daNone; Ch1:#$03B1; Ch2:#$0306; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH VRACHY
  6070. (Unicode:#$1FB1; Attr:daNone; Ch1:#$03B1; Ch2:#$0304; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH MACRON
  6071. (Unicode:#$1FB2; Attr:daNone; Ch1:#$1F70; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
  6072. (Unicode:#$1FB3; Attr:daNone; Ch1:#$03B1; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
  6073. (Unicode:#$1FB4; Attr:daNone; Ch1:#$03AC; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
  6074. (Unicode:#$1FB6; Attr:daNone; Ch1:#$03B1; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PERISPOMENI
  6075. (Unicode:#$1FB7; Attr:daNone; Ch1:#$1FB6; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
  6076. (Unicode:#$1FB8; Attr:daNone; Ch1:#$0391; Ch2:#$0306; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH VRACHY
  6077. (Unicode:#$1FB9; Attr:daNone; Ch1:#$0391; Ch2:#$0304; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH MACRON
  6078. (Unicode:#$1FBA; Attr:daNone; Ch1:#$0391; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH VARIA
  6079. (Unicode:#$1FBB; Attr:daNone; Ch1:#$0386; Ch2:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH OXIA
  6080. (Unicode:#$1FBC; Attr:daNone; Ch1:#$0391; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
  6081. (Unicode:#$1FBD; Attr:daCompat; Ch1:#$0020; Ch2:#$0313; Ch3:#$FFFF), // GREEK KORONIS
  6082. (Unicode:#$1FBE; Attr:daNone; Ch1:#$03B9; Ch2:#$FFFF), // GREEK PROSGEGRAMMENI
  6083. (Unicode:#$1FBF; Attr:daCompat; Ch1:#$0020; Ch2:#$0313; Ch3:#$FFFF), // GREEK PSILI
  6084. (Unicode:#$1FC0; Attr:daCompat; Ch1:#$0020; Ch2:#$0342; Ch3:#$FFFF), // GREEK PERISPOMENI
  6085. (Unicode:#$1FC1; Attr:daNone; Ch1:#$00A8; Ch2:#$0342; Ch3:#$FFFF), // GREEK DIALYTIKA AND PERISPOMENI
  6086. (Unicode:#$1FC2; Attr:daNone; Ch1:#$1F74; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
  6087. (Unicode:#$1FC3; Attr:daNone; Ch1:#$03B7; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
  6088. (Unicode:#$1FC4; Attr:daNone; Ch1:#$03AE; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
  6089. (Unicode:#$1FC6; Attr:daNone; Ch1:#$03B7; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PERISPOMENI
  6090. (Unicode:#$1FC7; Attr:daNone; Ch1:#$1FC6; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
  6091. (Unicode:#$1FC8; Attr:daNone; Ch1:#$0395; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH VARIA
  6092. (Unicode:#$1FC9; Attr:daNone; Ch1:#$0388; Ch2:#$FFFF), // GREEK CAPITAL LETTER EPSILON WITH OXIA
  6093. (Unicode:#$1FCA; Attr:daNone; Ch1:#$0397; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH VARIA
  6094. (Unicode:#$1FCB; Attr:daNone; Ch1:#$0389; Ch2:#$FFFF), // GREEK CAPITAL LETTER ETA WITH OXIA
  6095. (Unicode:#$1FCC; Attr:daNone; Ch1:#$0397; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
  6096. (Unicode:#$1FCD; Attr:daNone; Ch1:#$1FBF; Ch2:#$0300; Ch3:#$FFFF), // GREEK PSILI AND VARIA
  6097. (Unicode:#$1FCE; Attr:daNone; Ch1:#$1FBF; Ch2:#$0301; Ch3:#$FFFF), // GREEK PSILI AND OXIA
  6098. (Unicode:#$1FCF; Attr:daNone; Ch1:#$1FBF; Ch2:#$0342; Ch3:#$FFFF), // GREEK PSILI AND PERISPOMENI
  6099. (Unicode:#$1FD0; Attr:daNone; Ch1:#$03B9; Ch2:#$0306; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH VRACHY
  6100. (Unicode:#$1FD1; Attr:daNone; Ch1:#$03B9; Ch2:#$0304; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH MACRON
  6101. (Unicode:#$1FD2; Attr:daNone; Ch1:#$03CA; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
  6102. (Unicode:#$1FD3; Attr:daNone; Ch1:#$0390; Ch2:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
  6103. (Unicode:#$1FD6; Attr:daNone; Ch1:#$03B9; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH PERISPOMENI
  6104. (Unicode:#$1FD7; Attr:daNone; Ch1:#$03CA; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
  6105. (Unicode:#$1FD8; Attr:daNone; Ch1:#$0399; Ch2:#$0306; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH VRACHY
  6106. (Unicode:#$1FD9; Attr:daNone; Ch1:#$0399; Ch2:#$0304; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH MACRON
  6107. (Unicode:#$1FDA; Attr:daNone; Ch1:#$0399; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH VARIA
  6108. (Unicode:#$1FDB; Attr:daNone; Ch1:#$038A; Ch2:#$FFFF), // GREEK CAPITAL LETTER IOTA WITH OXIA
  6109. (Unicode:#$1FDD; Attr:daNone; Ch1:#$1FFE; Ch2:#$0300; Ch3:#$FFFF), // GREEK DASIA AND VARIA
  6110. (Unicode:#$1FDE; Attr:daNone; Ch1:#$1FFE; Ch2:#$0301; Ch3:#$FFFF), // GREEK DASIA AND OXIA
  6111. (Unicode:#$1FDF; Attr:daNone; Ch1:#$1FFE; Ch2:#$0342; Ch3:#$FFFF), // GREEK DASIA AND PERISPOMENI
  6112. (Unicode:#$1FE0; Attr:daNone; Ch1:#$03C5; Ch2:#$0306; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH VRACHY
  6113. (Unicode:#$1FE1; Attr:daNone; Ch1:#$03C5; Ch2:#$0304; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH MACRON
  6114. (Unicode:#$1FE2; Attr:daNone; Ch1:#$03CB; Ch2:#$0300; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
  6115. (Unicode:#$1FE3; Attr:daNone; Ch1:#$03B0; Ch2:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
  6116. (Unicode:#$1FE4; Attr:daNone; Ch1:#$03C1; Ch2:#$0313; Ch3:#$FFFF), // GREEK SMALL LETTER RHO WITH PSILI
  6117. (Unicode:#$1FE5; Attr:daNone; Ch1:#$03C1; Ch2:#$0314; Ch3:#$FFFF), // GREEK SMALL LETTER RHO WITH DASIA
  6118. (Unicode:#$1FE6; Attr:daNone; Ch1:#$03C5; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH PERISPOMENI
  6119. (Unicode:#$1FE7; Attr:daNone; Ch1:#$03CB; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
  6120. (Unicode:#$1FE8; Attr:daNone; Ch1:#$03A5; Ch2:#$0306; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH VRACHY
  6121. (Unicode:#$1FE9; Attr:daNone; Ch1:#$03A5; Ch2:#$0304; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH MACRON
  6122. (Unicode:#$1FEA; Attr:daNone; Ch1:#$03A5; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH VARIA
  6123. (Unicode:#$1FEB; Attr:daNone; Ch1:#$038E; Ch2:#$FFFF), // GREEK CAPITAL LETTER UPSILON WITH OXIA
  6124. (Unicode:#$1FEC; Attr:daNone; Ch1:#$03A1; Ch2:#$0314; Ch3:#$FFFF), // GREEK CAPITAL LETTER RHO WITH DASIA
  6125. (Unicode:#$1FED; Attr:daNone; Ch1:#$00A8; Ch2:#$0300; Ch3:#$FFFF), // GREEK DIALYTIKA AND VARIA
  6126. (Unicode:#$1FEE; Attr:daNone; Ch1:#$0385; Ch2:#$FFFF), // GREEK DIALYTIKA AND OXIA
  6127. (Unicode:#$1FEF; Attr:daNone; Ch1:#$0060; Ch2:#$FFFF), // GREEK VARIA
  6128. (Unicode:#$1FF2; Attr:daNone; Ch1:#$1F7C; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
  6129. (Unicode:#$1FF3; Attr:daNone; Ch1:#$03C9; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
  6130. (Unicode:#$1FF4; Attr:daNone; Ch1:#$03CE; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
  6131. (Unicode:#$1FF6; Attr:daNone; Ch1:#$03C9; Ch2:#$0342; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PERISPOMENI
  6132. (Unicode:#$1FF7; Attr:daNone; Ch1:#$1FF6; Ch2:#$0345; Ch3:#$FFFF), // GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
  6133. (Unicode:#$1FF8; Attr:daNone; Ch1:#$039F; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH VARIA
  6134. (Unicode:#$1FF9; Attr:daNone; Ch1:#$038C; Ch2:#$FFFF), // GREEK CAPITAL LETTER OMICRON WITH OXIA
  6135. (Unicode:#$1FFA; Attr:daNone; Ch1:#$03A9; Ch2:#$0300; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH VARIA
  6136. (Unicode:#$1FFB; Attr:daNone; Ch1:#$038F; Ch2:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH OXIA
  6137. (Unicode:#$1FFC; Attr:daNone; Ch1:#$03A9; Ch2:#$0345; Ch3:#$FFFF), // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
  6138. (Unicode:#$1FFD; Attr:daNone; Ch1:#$00B4; Ch2:#$FFFF), // GREEK OXIA
  6139. (Unicode:#$1FFE; Attr:daCompat; Ch1:#$0020; Ch2:#$0314; Ch3:#$FFFF), // GREEK DASIA
  6140. (Unicode:#$2000; Attr:daNone; Ch1:#$2002; Ch2:#$FFFF), // EN QUAD
  6141. (Unicode:#$2001; Attr:daNone; Ch1:#$2003; Ch2:#$FFFF), // EM QUAD
  6142. (Unicode:#$2002; Attr:daCompat; Ch1:#$0020; Ch2:#$FFFF), // EN SPACE
  6143. (Unicode:#$2003; Attr:daCompat; Ch1:#$0020; Ch2:#$FFFF), // EM SPACE
  6144. (Unicode:#$2004; Attr:daCompat; Ch1:#$0020; Ch2:#$FFFF), // THREE-PER-EM SPACE
  6145. (Unicode:#$2005; Attr:daCompat; Ch1:#$0020; Ch2:#$FFFF), // FOUR-PER-EM SPACE
  6146. (Unicode:#$2006; Attr:daCompat; Ch1:#$0020; Ch2:#$FFFF), // SIX-PER-EM SPACE
  6147. (Unicode:#$2007; Attr:daNoBreak; Ch1:#$0020; Ch2:#$FFFF), // FIGURE SPACE
  6148. (Unicode:#$2008; Attr:daCompat; Ch1:#$0020; Ch2:#$FFFF), // PUNCTUATION SPACE
  6149. (Unicode:#$2009; Attr:daCompat; Ch1:#$0020; Ch2:#$FFFF), // THIN SPACE
  6150. (Unicode:#$200A; Attr:daCompat; Ch1:#$0020; Ch2:#$FFFF), // HAIR SPACE
  6151. (Unicode:#$2011; Attr:daNoBreak; Ch1:#$2010; Ch2:#$FFFF), // NON-BREAKING HYPHEN
  6152. (Unicode:#$2017; Attr:daCompat; Ch1:#$0020; Ch2:#$0333; Ch3:#$FFFF), // DOUBLE LOW LINE
  6153. (Unicode:#$2024; Attr:daCompat; Ch1:#$002E; Ch2:#$FFFF), // ONE DOT LEADER
  6154. (Unicode:#$2025; Attr:daCompat; Ch1:#$002E; Ch2:#$002E; Ch3:#$FFFF), // TWO DOT LEADER
  6155. (Unicode:#$2026; Attr:daCompat; Ch1:#$002E; Ch2:#$002E; Ch3:#$002E; Ch4:#$FFFF), // HORIZONTAL ELLIPSIS
  6156. (Unicode:#$202F; Attr:daNoBreak; Ch1:#$0020; Ch2:#$FFFF), // NARROW NO-BREAK SPACE
  6157. (Unicode:#$2033; Attr:daCompat; Ch1:#$2032; Ch2:#$2032; Ch3:#$FFFF), // DOUBLE PRIME
  6158. (Unicode:#$2034; Attr:daCompat; Ch1:#$2032; Ch2:#$2032; Ch3:#$2032; Ch4:#$FFFF), // TRIPLE PRIME
  6159. (Unicode:#$2036; Attr:daCompat; Ch1:#$2035; Ch2:#$2035; Ch3:#$FFFF), // REVERSED DOUBLE PRIME
  6160. (Unicode:#$2037; Attr:daCompat; Ch1:#$2035; Ch2:#$2035; Ch3:#$2035; Ch4:#$FFFF), // REVERSED TRIPLE PRIME
  6161. (Unicode:#$203C; Attr:daCompat; Ch1:#$0021; Ch2:#$0021; Ch3:#$FFFF), // DOUBLE EXCLAMATION MARK
  6162. (Unicode:#$203E; Attr:daCompat; Ch1:#$0020; Ch2:#$0305; Ch3:#$FFFF), // OVERLINE
  6163. (Unicode:#$2048; Attr:daCompat; Ch1:#$003F; Ch2:#$0021; Ch3:#$FFFF), // QUESTION EXCLAMATION MARK
  6164. (Unicode:#$2049; Attr:daCompat; Ch1:#$0021; Ch2:#$003F; Ch3:#$FFFF), // EXCLAMATION QUESTION MARK
  6165. (Unicode:#$2070; Attr:daSuper; Ch1:#$0030; Ch2:#$FFFF), // SUPERSCRIPT ZERO
  6166. (Unicode:#$2074; Attr:daSuper; Ch1:#$0034; Ch2:#$FFFF), // SUPERSCRIPT FOUR
  6167. (Unicode:#$2075; Attr:daSuper; Ch1:#$0035; Ch2:#$FFFF), // SUPERSCRIPT FIVE
  6168. (Unicode:#$2076; Attr:daSuper; Ch1:#$0036; Ch2:#$FFFF), // SUPERSCRIPT SIX
  6169. (Unicode:#$2077; Attr:daSuper; Ch1:#$0037; Ch2:#$FFFF), // SUPERSCRIPT SEVEN
  6170. (Unicode:#$2078; Attr:daSuper; Ch1:#$0038; Ch2:#$FFFF), // SUPERSCRIPT EIGHT
  6171. (Unicode:#$2079; Attr:daSuper; Ch1:#$0039; Ch2:#$FFFF), // SUPERSCRIPT NINE
  6172. (Unicode:#$207A; Attr:daSuper; Ch1:#$002B; Ch2:#$FFFF), // SUPERSCRIPT PLUS SIGN
  6173. (Unicode:#$207B; Attr:daSuper; Ch1:#$2212; Ch2:#$FFFF), // SUPERSCRIPT MINUS
  6174. (Unicode:#$207C; Attr:daSuper; Ch1:#$003D; Ch2:#$FFFF), // SUPERSCRIPT EQUALS SIGN
  6175. (Unicode:#$207D; Attr:daSuper; Ch1:#$0028; Ch2:#$FFFF), // SUPERSCRIPT LEFT PARENTHESIS
  6176. (Unicode:#$207E; Attr:daSuper; Ch1:#$0029; Ch2:#$FFFF), // SUPERSCRIPT RIGHT PARENTHESIS
  6177. (Unicode:#$207F; Attr:daSuper; Ch1:#$006E; Ch2:#$FFFF), // SUPERSCRIPT LATIN SMALL LETTER N
  6178. (Unicode:#$2080; Attr:daSub; Ch1:#$0030; Ch2:#$FFFF), // SUBSCRIPT ZERO
  6179. (Unicode:#$2081; Attr:daSub; Ch1:#$0031; Ch2:#$FFFF), // SUBSCRIPT ONE
  6180. (Unicode:#$2082; Attr:daSub; Ch1:#$0032; Ch2:#$FFFF), // SUBSCRIPT TWO
  6181. (Unicode:#$2083; Attr:daSub; Ch1:#$0033; Ch2:#$FFFF), // SUBSCRIPT THREE
  6182. (Unicode:#$2084; Attr:daSub; Ch1:#$0034; Ch2:#$FFFF), // SUBSCRIPT FOUR
  6183. (Unicode:#$2085; Attr:daSub; Ch1:#$0035; Ch2:#$FFFF), // SUBSCRIPT FIVE
  6184. (Unicode:#$2086; Attr:daSub; Ch1:#$0036; Ch2:#$FFFF), // SUBSCRIPT SIX
  6185. (Unicode:#$2087; Attr:daSub; Ch1:#$0037; Ch2:#$FFFF), // SUBSCRIPT SEVEN
  6186. (Unicode:#$2088; Attr:daSub; Ch1:#$0038; Ch2:#$FFFF), // SUBSCRIPT EIGHT
  6187. (Unicode:#$2089; Attr:daSub; Ch1:#$0039; Ch2:#$FFFF), // SUBSCRIPT NINE
  6188. (Unicode:#$208A; Attr:daSub; Ch1:#$002B; Ch2:#$FFFF), // SUBSCRIPT PLUS SIGN
  6189. (Unicode:#$208B; Attr:daSub; Ch1:#$2212; Ch2:#$FFFF), // SUBSCRIPT MINUS
  6190. (Unicode:#$208C; Attr:daSub; Ch1:#$003D; Ch2:#$FFFF), // SUBSCRIPT EQUALS SIGN
  6191. (Unicode:#$208D; Attr:daSub; Ch1:#$0028; Ch2:#$FFFF), // SUBSCRIPT LEFT PARENTHESIS
  6192. (Unicode:#$208E; Attr:daSub; Ch1:#$0029; Ch2:#$FFFF), // SUBSCRIPT RIGHT PARENTHESIS
  6193. (Unicode:#$20A8; Attr:daCompat; Ch1:#$0052; Ch2:#$0073; Ch3:#$FFFF), // RUPEE SIGN
  6194. (Unicode:#$2100; Attr:daCompat; Ch1:#$0061; Ch2:#$002F; Ch3:#$0063; Ch4:#$FFFF), // ACCOUNT OF
  6195. (Unicode:#$2101; Attr:daCompat; Ch1:#$0061; Ch2:#$002F; Ch3:#$0073; Ch4:#$FFFF), // ADDRESSED TO THE SUBJECT
  6196. (Unicode:#$2102; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // DOUBLE-STRUCK CAPITAL C
  6197. (Unicode:#$2103; Attr:daCompat; Ch1:#$00B0; Ch2:#$0043; Ch3:#$FFFF), // DEGREE CELSIUS
  6198. (Unicode:#$2105; Attr:daCompat; Ch1:#$0063; Ch2:#$002F; Ch3:#$006F; Ch4:#$FFFF), // CARE OF
  6199. (Unicode:#$2106; Attr:daCompat; Ch1:#$0063; Ch2:#$002F; Ch3:#$0075; Ch4:#$FFFF), // CADA UNA
  6200. (Unicode:#$2107; Attr:daCompat; Ch1:#$0190; Ch2:#$FFFF), // EULER CONSTANT
  6201. (Unicode:#$2109; Attr:daCompat; Ch1:#$00B0; Ch2:#$0046; Ch3:#$FFFF), // DEGREE FAHRENHEIT
  6202. (Unicode:#$210A; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // SCRIPT SMALL G
  6203. (Unicode:#$210B; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // SCRIPT CAPITAL H
  6204. (Unicode:#$210C; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // BLACK-LETTER CAPITAL H
  6205. (Unicode:#$210D; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // DOUBLE-STRUCK CAPITAL H
  6206. (Unicode:#$210E; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // PLANCK CONSTANT
  6207. (Unicode:#$210F; Attr:daFont; Ch1:#$0127; Ch2:#$FFFF), // PLANCK CONSTANT OVER TWO PI
  6208. (Unicode:#$2110; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // SCRIPT CAPITAL I
  6209. (Unicode:#$2111; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // BLACK-LETTER CAPITAL I
  6210. (Unicode:#$2112; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // SCRIPT CAPITAL L
  6211. (Unicode:#$2113; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // SCRIPT SMALL L
  6212. (Unicode:#$2115; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // DOUBLE-STRUCK CAPITAL N
  6213. (Unicode:#$2116; Attr:daCompat; Ch1:#$004E; Ch2:#$006F; Ch3:#$FFFF), // NUMERO SIGN
  6214. (Unicode:#$2119; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // DOUBLE-STRUCK CAPITAL P
  6215. (Unicode:#$211A; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // DOUBLE-STRUCK CAPITAL Q
  6216. (Unicode:#$211B; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // SCRIPT CAPITAL R
  6217. (Unicode:#$211C; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // BLACK-LETTER CAPITAL R
  6218. (Unicode:#$211D; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // DOUBLE-STRUCK CAPITAL R
  6219. (Unicode:#$2120; Attr:daSuper; Ch1:#$0053; Ch2:#$004D; Ch3:#$FFFF), // SERVICE MARK
  6220. (Unicode:#$2121; Attr:daCompat; Ch1:#$0054; Ch2:#$0045; Ch3:#$004C; Ch4:#$FFFF), // TELEPHONE SIGN
  6221. (Unicode:#$2122; Attr:daSuper; Ch1:#$0054; Ch2:#$004D; Ch3:#$FFFF), // TRADE MARK SIGN
  6222. (Unicode:#$2124; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // DOUBLE-STRUCK CAPITAL Z
  6223. (Unicode:#$2126; Attr:daNone; Ch1:#$03A9; Ch2:#$FFFF), // OHM SIGN
  6224. (Unicode:#$2128; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // BLACK-LETTER CAPITAL Z
  6225. (Unicode:#$212A; Attr:daNone; Ch1:#$004B; Ch2:#$FFFF), // KELVIN SIGN
  6226. (Unicode:#$212B; Attr:daNone; Ch1:#$00C5; Ch2:#$FFFF), // ANGSTROM SIGN
  6227. (Unicode:#$212C; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // SCRIPT CAPITAL B
  6228. (Unicode:#$212D; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // BLACK-LETTER CAPITAL C
  6229. (Unicode:#$212F; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // SCRIPT SMALL E
  6230. (Unicode:#$2130; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // SCRIPT CAPITAL E
  6231. (Unicode:#$2131; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // SCRIPT CAPITAL F
  6232. (Unicode:#$2133; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // SCRIPT CAPITAL M
  6233. (Unicode:#$2134; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // SCRIPT SMALL O
  6234. (Unicode:#$2135; Attr:daCompat; Ch1:#$05D0; Ch2:#$FFFF), // ALEF SYMBOL
  6235. (Unicode:#$2136; Attr:daCompat; Ch1:#$05D1; Ch2:#$FFFF), // BET SYMBOL
  6236. (Unicode:#$2137; Attr:daCompat; Ch1:#$05D2; Ch2:#$FFFF), // GIMEL SYMBOL
  6237. (Unicode:#$2138; Attr:daCompat; Ch1:#$05D3; Ch2:#$FFFF), // DALET SYMBOL
  6238. (Unicode:#$2139; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // INFORMATION SOURCE
  6239. (Unicode:#$2153; Attr:daFraction; Ch1:#$0031; Ch2:#$2044; Ch3:#$0033; Ch4:#$FFFF), // VULGAR FRACTION ONE THIRD
  6240. (Unicode:#$2154; Attr:daFraction; Ch1:#$0032; Ch2:#$2044; Ch3:#$0033; Ch4:#$FFFF), // VULGAR FRACTION TWO THIRDS
  6241. (Unicode:#$2155; Attr:daFraction; Ch1:#$0031; Ch2:#$2044; Ch3:#$0035; Ch4:#$FFFF), // VULGAR FRACTION ONE FIFTH
  6242. (Unicode:#$2156; Attr:daFraction; Ch1:#$0032; Ch2:#$2044; Ch3:#$0035; Ch4:#$FFFF), // VULGAR FRACTION TWO FIFTHS
  6243. (Unicode:#$2157; Attr:daFraction; Ch1:#$0033; Ch2:#$2044; Ch3:#$0035; Ch4:#$FFFF), // VULGAR FRACTION THREE FIFTHS
  6244. (Unicode:#$2158; Attr:daFraction; Ch1:#$0034; Ch2:#$2044; Ch3:#$0035; Ch4:#$FFFF), // VULGAR FRACTION FOUR FIFTHS
  6245. (Unicode:#$2159; Attr:daFraction; Ch1:#$0031; Ch2:#$2044; Ch3:#$0036; Ch4:#$FFFF), // VULGAR FRACTION ONE SIXTH
  6246. (Unicode:#$215A; Attr:daFraction; Ch1:#$0035; Ch2:#$2044; Ch3:#$0036; Ch4:#$FFFF), // VULGAR FRACTION FIVE SIXTHS
  6247. (Unicode:#$215B; Attr:daFraction; Ch1:#$0031; Ch2:#$2044; Ch3:#$0038; Ch4:#$FFFF), // VULGAR FRACTION ONE EIGHTH
  6248. (Unicode:#$215C; Attr:daFraction; Ch1:#$0033; Ch2:#$2044; Ch3:#$0038; Ch4:#$FFFF), // VULGAR FRACTION THREE EIGHTHS
  6249. (Unicode:#$215D; Attr:daFraction; Ch1:#$0035; Ch2:#$2044; Ch3:#$0038; Ch4:#$FFFF), // VULGAR FRACTION FIVE EIGHTHS
  6250. (Unicode:#$215E; Attr:daFraction; Ch1:#$0037; Ch2:#$2044; Ch3:#$0038; Ch4:#$FFFF), // VULGAR FRACTION SEVEN EIGHTHS
  6251. (Unicode:#$215F; Attr:daFraction; Ch1:#$0031; Ch2:#$2044; Ch3:#$FFFF), // FRACTION NUMERATOR ONE
  6252. (Unicode:#$2160; Attr:daCompat; Ch1:#$0049; Ch2:#$FFFF), // ROMAN NUMERAL ONE
  6253. (Unicode:#$2161; Attr:daCompat; Ch1:#$0049; Ch2:#$0049; Ch3:#$FFFF), // ROMAN NUMERAL TWO
  6254. (Unicode:#$2162; Attr:daCompat; Ch1:#$0049; Ch2:#$0049; Ch3:#$0049; Ch4:#$FFFF), // ROMAN NUMERAL THREE
  6255. (Unicode:#$2163; Attr:daCompat; Ch1:#$0049; Ch2:#$0056; Ch3:#$FFFF), // ROMAN NUMERAL FOUR
  6256. (Unicode:#$2164; Attr:daCompat; Ch1:#$0056; Ch2:#$FFFF), // ROMAN NUMERAL FIVE
  6257. (Unicode:#$2165; Attr:daCompat; Ch1:#$0056; Ch2:#$0049; Ch3:#$FFFF), // ROMAN NUMERAL SIX
  6258. (Unicode:#$2166; Attr:daCompat; Ch1:#$0056; Ch2:#$0049; Ch3:#$0049; Ch4:#$FFFF), // ROMAN NUMERAL SEVEN
  6259. (Unicode:#$2167; Attr:daCompat; Ch1:#$0056; Ch2:#$0049; Ch3:#$0049; Ch4:#$0049; Ch5:#$FFFF), // ROMAN NUMERAL EIGHT
  6260. (Unicode:#$2168; Attr:daCompat; Ch1:#$0049; Ch2:#$0058; Ch3:#$FFFF), // ROMAN NUMERAL NINE
  6261. (Unicode:#$2169; Attr:daCompat; Ch1:#$0058; Ch2:#$FFFF), // ROMAN NUMERAL TEN
  6262. (Unicode:#$216A; Attr:daCompat; Ch1:#$0058; Ch2:#$0049; Ch3:#$FFFF), // ROMAN NUMERAL ELEVEN
  6263. (Unicode:#$216B; Attr:daCompat; Ch1:#$0058; Ch2:#$0049; Ch3:#$0049; Ch4:#$FFFF), // ROMAN NUMERAL TWELVE
  6264. (Unicode:#$216C; Attr:daCompat; Ch1:#$004C; Ch2:#$FFFF), // ROMAN NUMERAL FIFTY
  6265. (Unicode:#$216D; Attr:daCompat; Ch1:#$0043; Ch2:#$FFFF), // ROMAN NUMERAL ONE HUNDRED
  6266. (Unicode:#$216E; Attr:daCompat; Ch1:#$0044; Ch2:#$FFFF), // ROMAN NUMERAL FIVE HUNDRED
  6267. (Unicode:#$216F; Attr:daCompat; Ch1:#$004D; Ch2:#$FFFF), // ROMAN NUMERAL ONE THOUSAND
  6268. (Unicode:#$2170; Attr:daCompat; Ch1:#$0069; Ch2:#$FFFF), // SMALL ROMAN NUMERAL ONE
  6269. (Unicode:#$2171; Attr:daCompat; Ch1:#$0069; Ch2:#$0069; Ch3:#$FFFF), // SMALL ROMAN NUMERAL TWO
  6270. (Unicode:#$2172; Attr:daCompat; Ch1:#$0069; Ch2:#$0069; Ch3:#$0069; Ch4:#$FFFF), // SMALL ROMAN NUMERAL THREE
  6271. (Unicode:#$2173; Attr:daCompat; Ch1:#$0069; Ch2:#$0076; Ch3:#$FFFF), // SMALL ROMAN NUMERAL FOUR
  6272. (Unicode:#$2174; Attr:daCompat; Ch1:#$0076; Ch2:#$FFFF), // SMALL ROMAN NUMERAL FIVE
  6273. (Unicode:#$2175; Attr:daCompat; Ch1:#$0076; Ch2:#$0069; Ch3:#$FFFF), // SMALL ROMAN NUMERAL SIX
  6274. (Unicode:#$2176; Attr:daCompat; Ch1:#$0076; Ch2:#$0069; Ch3:#$0069; Ch4:#$FFFF), // SMALL ROMAN NUMERAL SEVEN
  6275. (Unicode:#$2177; Attr:daCompat; Ch1:#$0076; Ch2:#$0069; Ch3:#$0069; Ch4:#$0069; Ch5:#$FFFF), // SMALL ROMAN NUMERAL EIGHT
  6276. (Unicode:#$2178; Attr:daCompat; Ch1:#$0069; Ch2:#$0078; Ch3:#$FFFF), // SMALL ROMAN NUMERAL NINE
  6277. (Unicode:#$2179; Attr:daCompat; Ch1:#$0078; Ch2:#$FFFF), // SMALL ROMAN NUMERAL TEN
  6278. (Unicode:#$217A; Attr:daCompat; Ch1:#$0078; Ch2:#$0069; Ch3:#$FFFF), // SMALL ROMAN NUMERAL ELEVEN
  6279. (Unicode:#$217B; Attr:daCompat; Ch1:#$0078; Ch2:#$0069; Ch3:#$0069; Ch4:#$FFFF), // SMALL ROMAN NUMERAL TWELVE
  6280. (Unicode:#$217C; Attr:daCompat; Ch1:#$006C; Ch2:#$FFFF), // SMALL ROMAN NUMERAL FIFTY
  6281. (Unicode:#$217D; Attr:daCompat; Ch1:#$0063; Ch2:#$FFFF), // SMALL ROMAN NUMERAL ONE HUNDRED
  6282. (Unicode:#$217E; Attr:daCompat; Ch1:#$0064; Ch2:#$FFFF), // SMALL ROMAN NUMERAL FIVE HUNDRED
  6283. (Unicode:#$217F; Attr:daCompat; Ch1:#$006D; Ch2:#$FFFF), // SMALL ROMAN NUMERAL ONE THOUSAND
  6284. (Unicode:#$219A; Attr:daNone; Ch1:#$2190; Ch2:#$0338; Ch3:#$FFFF), // LEFTWARDS ARROW WITH STROKE
  6285. (Unicode:#$219B; Attr:daNone; Ch1:#$2192; Ch2:#$0338; Ch3:#$FFFF), // RIGHTWARDS ARROW WITH STROKE
  6286. (Unicode:#$21AE; Attr:daNone; Ch1:#$2194; Ch2:#$0338; Ch3:#$FFFF), // LEFT RIGHT ARROW WITH STROKE
  6287. (Unicode:#$21CD; Attr:daNone; Ch1:#$21D0; Ch2:#$0338; Ch3:#$FFFF), // LEFTWARDS DOUBLE ARROW WITH STROKE
  6288. (Unicode:#$21CE; Attr:daNone; Ch1:#$21D4; Ch2:#$0338; Ch3:#$FFFF), // LEFT RIGHT DOUBLE ARROW WITH STROKE
  6289. (Unicode:#$21CF; Attr:daNone; Ch1:#$21D2; Ch2:#$0338; Ch3:#$FFFF), // RIGHTWARDS DOUBLE ARROW WITH STROKE
  6290. (Unicode:#$2204; Attr:daNone; Ch1:#$2203; Ch2:#$0338; Ch3:#$FFFF), // THERE DOES NOT EXIST
  6291. (Unicode:#$2209; Attr:daNone; Ch1:#$2208; Ch2:#$0338; Ch3:#$FFFF), // NOT AN ELEMENT OF
  6292. (Unicode:#$220C; Attr:daNone; Ch1:#$220B; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT CONTAIN AS MEMBER
  6293. (Unicode:#$2224; Attr:daNone; Ch1:#$2223; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT DIVIDE
  6294. (Unicode:#$2226; Attr:daNone; Ch1:#$2225; Ch2:#$0338; Ch3:#$FFFF), // NOT PARALLEL TO
  6295. (Unicode:#$222C; Attr:daCompat; Ch1:#$222B; Ch2:#$222B; Ch3:#$FFFF), // DOUBLE INTEGRAL
  6296. (Unicode:#$222D; Attr:daCompat; Ch1:#$222B; Ch2:#$222B; Ch3:#$222B; Ch4:#$FFFF), // TRIPLE INTEGRAL
  6297. (Unicode:#$222F; Attr:daCompat; Ch1:#$222E; Ch2:#$222E; Ch3:#$FFFF), // SURFACE INTEGRAL
  6298. (Unicode:#$2230; Attr:daCompat; Ch1:#$222E; Ch2:#$222E; Ch3:#$222E; Ch4:#$FFFF), // VOLUME INTEGRAL
  6299. (Unicode:#$2241; Attr:daNone; Ch1:#$223C; Ch2:#$0338; Ch3:#$FFFF), // NOT TILDE
  6300. (Unicode:#$2244; Attr:daNone; Ch1:#$2243; Ch2:#$0338; Ch3:#$FFFF), // NOT ASYMPTOTICALLY EQUAL TO
  6301. (Unicode:#$2247; Attr:daNone; Ch1:#$2245; Ch2:#$0338; Ch3:#$FFFF), // NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
  6302. (Unicode:#$2249; Attr:daNone; Ch1:#$2248; Ch2:#$0338; Ch3:#$FFFF), // NOT ALMOST EQUAL TO
  6303. (Unicode:#$2260; Attr:daNone; Ch1:#$003D; Ch2:#$0338; Ch3:#$FFFF), // NOT EQUAL TO
  6304. (Unicode:#$2262; Attr:daNone; Ch1:#$2261; Ch2:#$0338; Ch3:#$FFFF), // NOT IDENTICAL TO
  6305. (Unicode:#$226D; Attr:daNone; Ch1:#$224D; Ch2:#$0338; Ch3:#$FFFF), // NOT EQUIVALENT TO
  6306. (Unicode:#$226E; Attr:daNone; Ch1:#$003C; Ch2:#$0338; Ch3:#$FFFF), // NOT LESS-THAN
  6307. (Unicode:#$226F; Attr:daNone; Ch1:#$003E; Ch2:#$0338; Ch3:#$FFFF), // NOT GREATER-THAN
  6308. (Unicode:#$2270; Attr:daNone; Ch1:#$2264; Ch2:#$0338; Ch3:#$FFFF), // NEITHER LESS-THAN NOR EQUAL TO
  6309. (Unicode:#$2271; Attr:daNone; Ch1:#$2265; Ch2:#$0338; Ch3:#$FFFF), // NEITHER GREATER-THAN NOR EQUAL TO
  6310. (Unicode:#$2274; Attr:daNone; Ch1:#$2272; Ch2:#$0338; Ch3:#$FFFF), // NEITHER LESS-THAN NOR EQUIVALENT TO
  6311. (Unicode:#$2275; Attr:daNone; Ch1:#$2273; Ch2:#$0338; Ch3:#$FFFF), // NEITHER GREATER-THAN NOR EQUIVALENT TO
  6312. (Unicode:#$2278; Attr:daNone; Ch1:#$2276; Ch2:#$0338; Ch3:#$FFFF), // NEITHER LESS-THAN NOR GREATER-THAN
  6313. (Unicode:#$2279; Attr:daNone; Ch1:#$2277; Ch2:#$0338; Ch3:#$FFFF), // NEITHER GREATER-THAN NOR LESS-THAN
  6314. (Unicode:#$2280; Attr:daNone; Ch1:#$227A; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT PRECEDE
  6315. (Unicode:#$2281; Attr:daNone; Ch1:#$227B; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT SUCCEED
  6316. (Unicode:#$2284; Attr:daNone; Ch1:#$2282; Ch2:#$0338; Ch3:#$FFFF), // NOT A SUBSET OF
  6317. (Unicode:#$2285; Attr:daNone; Ch1:#$2283; Ch2:#$0338; Ch3:#$FFFF), // NOT A SUPERSET OF
  6318. (Unicode:#$2288; Attr:daNone; Ch1:#$2286; Ch2:#$0338; Ch3:#$FFFF), // NEITHER A SUBSET OF NOR EQUAL TO
  6319. (Unicode:#$2289; Attr:daNone; Ch1:#$2287; Ch2:#$0338; Ch3:#$FFFF), // NEITHER A SUPERSET OF NOR EQUAL TO
  6320. (Unicode:#$22AC; Attr:daNone; Ch1:#$22A2; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT PROVE
  6321. (Unicode:#$22AD; Attr:daNone; Ch1:#$22A8; Ch2:#$0338; Ch3:#$FFFF), // NOT TRUE
  6322. (Unicode:#$22AE; Attr:daNone; Ch1:#$22A9; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT FORCE
  6323. (Unicode:#$22AF; Attr:daNone; Ch1:#$22AB; Ch2:#$0338; Ch3:#$FFFF), // NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
  6324. (Unicode:#$22E0; Attr:daNone; Ch1:#$227C; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT PRECEDE OR EQUAL
  6325. (Unicode:#$22E1; Attr:daNone; Ch1:#$227D; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT SUCCEED OR EQUAL
  6326. (Unicode:#$22E2; Attr:daNone; Ch1:#$2291; Ch2:#$0338; Ch3:#$FFFF), // NOT SQUARE IMAGE OF OR EQUAL TO
  6327. (Unicode:#$22E3; Attr:daNone; Ch1:#$2292; Ch2:#$0338; Ch3:#$FFFF), // NOT SQUARE ORIGINAL OF OR EQUAL TO
  6328. (Unicode:#$22EA; Attr:daNone; Ch1:#$22B2; Ch2:#$0338; Ch3:#$FFFF), // NOT NORMAL SUBGROUP OF
  6329. (Unicode:#$22EB; Attr:daNone; Ch1:#$22B3; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT CONTAIN AS NORMAL SUBGROUP
  6330. (Unicode:#$22EC; Attr:daNone; Ch1:#$22B4; Ch2:#$0338; Ch3:#$FFFF), // NOT NORMAL SUBGROUP OF OR EQUAL TO
  6331. (Unicode:#$22ED; Attr:daNone; Ch1:#$22B5; Ch2:#$0338; Ch3:#$FFFF), // DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
  6332. (Unicode:#$2329; Attr:daNone; Ch1:#$3008; Ch2:#$FFFF), // LEFT-POINTING ANGLE BRACKET
  6333. (Unicode:#$232A; Attr:daNone; Ch1:#$3009; Ch2:#$FFFF), // RIGHT-POINTING ANGLE BRACKET
  6334. (Unicode:#$2460; Attr:daCircle; Ch1:#$0031; Ch2:#$FFFF), // CIRCLED DIGIT ONE
  6335. (Unicode:#$2461; Attr:daCircle; Ch1:#$0032; Ch2:#$FFFF), // CIRCLED DIGIT TWO
  6336. (Unicode:#$2462; Attr:daCircle; Ch1:#$0033; Ch2:#$FFFF), // CIRCLED DIGIT THREE
  6337. (Unicode:#$2463; Attr:daCircle; Ch1:#$0034; Ch2:#$FFFF), // CIRCLED DIGIT FOUR
  6338. (Unicode:#$2464; Attr:daCircle; Ch1:#$0035; Ch2:#$FFFF), // CIRCLED DIGIT FIVE
  6339. (Unicode:#$2465; Attr:daCircle; Ch1:#$0036; Ch2:#$FFFF), // CIRCLED DIGIT SIX
  6340. (Unicode:#$2466; Attr:daCircle; Ch1:#$0037; Ch2:#$FFFF), // CIRCLED DIGIT SEVEN
  6341. (Unicode:#$2467; Attr:daCircle; Ch1:#$0038; Ch2:#$FFFF), // CIRCLED DIGIT EIGHT
  6342. (Unicode:#$2468; Attr:daCircle; Ch1:#$0039; Ch2:#$FFFF), // CIRCLED DIGIT NINE
  6343. (Unicode:#$2469; Attr:daCircle; Ch1:#$0031; Ch2:#$0030; Ch3:#$FFFF), // CIRCLED NUMBER TEN
  6344. (Unicode:#$246A; Attr:daCircle; Ch1:#$0031; Ch2:#$0031; Ch3:#$FFFF), // CIRCLED NUMBER ELEVEN
  6345. (Unicode:#$246B; Attr:daCircle; Ch1:#$0031; Ch2:#$0032; Ch3:#$FFFF), // CIRCLED NUMBER TWELVE
  6346. (Unicode:#$246C; Attr:daCircle; Ch1:#$0031; Ch2:#$0033; Ch3:#$FFFF), // CIRCLED NUMBER THIRTEEN
  6347. (Unicode:#$246D; Attr:daCircle; Ch1:#$0031; Ch2:#$0034; Ch3:#$FFFF), // CIRCLED NUMBER FOURTEEN
  6348. (Unicode:#$246E; Attr:daCircle; Ch1:#$0031; Ch2:#$0035; Ch3:#$FFFF), // CIRCLED NUMBER FIFTEEN
  6349. (Unicode:#$246F; Attr:daCircle; Ch1:#$0031; Ch2:#$0036; Ch3:#$FFFF), // CIRCLED NUMBER SIXTEEN
  6350. (Unicode:#$2470; Attr:daCircle; Ch1:#$0031; Ch2:#$0037; Ch3:#$FFFF), // CIRCLED NUMBER SEVENTEEN
  6351. (Unicode:#$2471; Attr:daCircle; Ch1:#$0031; Ch2:#$0038; Ch3:#$FFFF), // CIRCLED NUMBER EIGHTEEN
  6352. (Unicode:#$2472; Attr:daCircle; Ch1:#$0031; Ch2:#$0039; Ch3:#$FFFF), // CIRCLED NUMBER NINETEEN
  6353. (Unicode:#$2473; Attr:daCircle; Ch1:#$0032; Ch2:#$0030; Ch3:#$FFFF), // CIRCLED NUMBER TWENTY
  6354. (Unicode:#$2474; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT ONE
  6355. (Unicode:#$2475; Attr:daCompat; Ch1:#$0028; Ch2:#$0032; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT TWO
  6356. (Unicode:#$2476; Attr:daCompat; Ch1:#$0028; Ch2:#$0033; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT THREE
  6357. (Unicode:#$2477; Attr:daCompat; Ch1:#$0028; Ch2:#$0034; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT FOUR
  6358. (Unicode:#$2478; Attr:daCompat; Ch1:#$0028; Ch2:#$0035; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT FIVE
  6359. (Unicode:#$2479; Attr:daCompat; Ch1:#$0028; Ch2:#$0036; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT SIX
  6360. (Unicode:#$247A; Attr:daCompat; Ch1:#$0028; Ch2:#$0037; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT SEVEN
  6361. (Unicode:#$247B; Attr:daCompat; Ch1:#$0028; Ch2:#$0038; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT EIGHT
  6362. (Unicode:#$247C; Attr:daCompat; Ch1:#$0028; Ch2:#$0039; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED DIGIT NINE
  6363. (Unicode:#$247D; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0030; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER TEN
  6364. (Unicode:#$247E; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0031; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER ELEVEN
  6365. (Unicode:#$247F; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0032; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER TWELVE
  6366. (Unicode:#$2480; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0033; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER THIRTEEN
  6367. (Unicode:#$2481; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0034; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER FOURTEEN
  6368. (Unicode:#$2482; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0035; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER FIFTEEN
  6369. (Unicode:#$2483; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0036; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER SIXTEEN
  6370. (Unicode:#$2484; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0037; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER SEVENTEEN
  6371. (Unicode:#$2485; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0038; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER EIGHTEEN
  6372. (Unicode:#$2486; Attr:daCompat; Ch1:#$0028; Ch2:#$0031; Ch3:#$0039; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER NINETEEN
  6373. (Unicode:#$2487; Attr:daCompat; Ch1:#$0028; Ch2:#$0032; Ch3:#$0030; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED NUMBER TWENTY
  6374. (Unicode:#$2488; Attr:daCompat; Ch1:#$0031; Ch2:#$002E; Ch3:#$FFFF), // DIGIT ONE FULL STOP
  6375. (Unicode:#$2489; Attr:daCompat; Ch1:#$0032; Ch2:#$002E; Ch3:#$FFFF), // DIGIT TWO FULL STOP
  6376. (Unicode:#$248A; Attr:daCompat; Ch1:#$0033; Ch2:#$002E; Ch3:#$FFFF), // DIGIT THREE FULL STOP
  6377. (Unicode:#$248B; Attr:daCompat; Ch1:#$0034; Ch2:#$002E; Ch3:#$FFFF), // DIGIT FOUR FULL STOP
  6378. (Unicode:#$248C; Attr:daCompat; Ch1:#$0035; Ch2:#$002E; Ch3:#$FFFF), // DIGIT FIVE FULL STOP
  6379. (Unicode:#$248D; Attr:daCompat; Ch1:#$0036; Ch2:#$002E; Ch3:#$FFFF), // DIGIT SIX FULL STOP
  6380. (Unicode:#$248E; Attr:daCompat; Ch1:#$0037; Ch2:#$002E; Ch3:#$FFFF), // DIGIT SEVEN FULL STOP
  6381. (Unicode:#$248F; Attr:daCompat; Ch1:#$0038; Ch2:#$002E; Ch3:#$FFFF), // DIGIT EIGHT FULL STOP
  6382. (Unicode:#$2490; Attr:daCompat; Ch1:#$0039; Ch2:#$002E; Ch3:#$FFFF), // DIGIT NINE FULL STOP
  6383. (Unicode:#$2491; Attr:daCompat; Ch1:#$0031; Ch2:#$0030; Ch3:#$002E; Ch4:#$FFFF), // NUMBER TEN FULL STOP
  6384. (Unicode:#$2492; Attr:daCompat; Ch1:#$0031; Ch2:#$0031; Ch3:#$002E; Ch4:#$FFFF), // NUMBER ELEVEN FULL STOP
  6385. (Unicode:#$2493; Attr:daCompat; Ch1:#$0031; Ch2:#$0032; Ch3:#$002E; Ch4:#$FFFF), // NUMBER TWELVE FULL STOP
  6386. (Unicode:#$2494; Attr:daCompat; Ch1:#$0031; Ch2:#$0033; Ch3:#$002E; Ch4:#$FFFF), // NUMBER THIRTEEN FULL STOP
  6387. (Unicode:#$2495; Attr:daCompat; Ch1:#$0031; Ch2:#$0034; Ch3:#$002E; Ch4:#$FFFF), // NUMBER FOURTEEN FULL STOP
  6388. (Unicode:#$2496; Attr:daCompat; Ch1:#$0031; Ch2:#$0035; Ch3:#$002E; Ch4:#$FFFF), // NUMBER FIFTEEN FULL STOP
  6389. (Unicode:#$2497; Attr:daCompat; Ch1:#$0031; Ch2:#$0036; Ch3:#$002E; Ch4:#$FFFF), // NUMBER SIXTEEN FULL STOP
  6390. (Unicode:#$2498; Attr:daCompat; Ch1:#$0031; Ch2:#$0037; Ch3:#$002E; Ch4:#$FFFF), // NUMBER SEVENTEEN FULL STOP
  6391. (Unicode:#$2499; Attr:daCompat; Ch1:#$0031; Ch2:#$0038; Ch3:#$002E; Ch4:#$FFFF), // NUMBER EIGHTEEN FULL STOP
  6392. (Unicode:#$249A; Attr:daCompat; Ch1:#$0031; Ch2:#$0039; Ch3:#$002E; Ch4:#$FFFF), // NUMBER NINETEEN FULL STOP
  6393. (Unicode:#$249B; Attr:daCompat; Ch1:#$0032; Ch2:#$0030; Ch3:#$002E; Ch4:#$FFFF), // NUMBER TWENTY FULL STOP
  6394. (Unicode:#$249C; Attr:daCompat; Ch1:#$0028; Ch2:#$0061; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER A
  6395. (Unicode:#$249D; Attr:daCompat; Ch1:#$0028; Ch2:#$0062; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER B
  6396. (Unicode:#$249E; Attr:daCompat; Ch1:#$0028; Ch2:#$0063; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER C
  6397. (Unicode:#$249F; Attr:daCompat; Ch1:#$0028; Ch2:#$0064; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER D
  6398. (Unicode:#$24A0; Attr:daCompat; Ch1:#$0028; Ch2:#$0065; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER E
  6399. (Unicode:#$24A1; Attr:daCompat; Ch1:#$0028; Ch2:#$0066; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER F
  6400. (Unicode:#$24A2; Attr:daCompat; Ch1:#$0028; Ch2:#$0067; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER G
  6401. (Unicode:#$24A3; Attr:daCompat; Ch1:#$0028; Ch2:#$0068; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER H
  6402. (Unicode:#$24A4; Attr:daCompat; Ch1:#$0028; Ch2:#$0069; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER I
  6403. (Unicode:#$24A5; Attr:daCompat; Ch1:#$0028; Ch2:#$006A; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER J
  6404. (Unicode:#$24A6; Attr:daCompat; Ch1:#$0028; Ch2:#$006B; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER K
  6405. (Unicode:#$24A7; Attr:daCompat; Ch1:#$0028; Ch2:#$006C; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER L
  6406. (Unicode:#$24A8; Attr:daCompat; Ch1:#$0028; Ch2:#$006D; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER M
  6407. (Unicode:#$24A9; Attr:daCompat; Ch1:#$0028; Ch2:#$006E; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER N
  6408. (Unicode:#$24AA; Attr:daCompat; Ch1:#$0028; Ch2:#$006F; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER O
  6409. (Unicode:#$24AB; Attr:daCompat; Ch1:#$0028; Ch2:#$0070; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER P
  6410. (Unicode:#$24AC; Attr:daCompat; Ch1:#$0028; Ch2:#$0071; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER Q
  6411. (Unicode:#$24AD; Attr:daCompat; Ch1:#$0028; Ch2:#$0072; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER R
  6412. (Unicode:#$24AE; Attr:daCompat; Ch1:#$0028; Ch2:#$0073; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER S
  6413. (Unicode:#$24AF; Attr:daCompat; Ch1:#$0028; Ch2:#$0074; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER T
  6414. (Unicode:#$24B0; Attr:daCompat; Ch1:#$0028; Ch2:#$0075; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER U
  6415. (Unicode:#$24B1; Attr:daCompat; Ch1:#$0028; Ch2:#$0076; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER V
  6416. (Unicode:#$24B2; Attr:daCompat; Ch1:#$0028; Ch2:#$0077; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER W
  6417. (Unicode:#$24B3; Attr:daCompat; Ch1:#$0028; Ch2:#$0078; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER X
  6418. (Unicode:#$24B4; Attr:daCompat; Ch1:#$0028; Ch2:#$0079; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER Y
  6419. (Unicode:#$24B5; Attr:daCompat; Ch1:#$0028; Ch2:#$007A; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED LATIN SMALL LETTER Z
  6420. (Unicode:#$24B6; Attr:daCircle; Ch1:#$0041; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER A
  6421. (Unicode:#$24B7; Attr:daCircle; Ch1:#$0042; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER B
  6422. (Unicode:#$24B8; Attr:daCircle; Ch1:#$0043; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER C
  6423. (Unicode:#$24B9; Attr:daCircle; Ch1:#$0044; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER D
  6424. (Unicode:#$24BA; Attr:daCircle; Ch1:#$0045; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER E
  6425. (Unicode:#$24BB; Attr:daCircle; Ch1:#$0046; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER F
  6426. (Unicode:#$24BC; Attr:daCircle; Ch1:#$0047; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER G
  6427. (Unicode:#$24BD; Attr:daCircle; Ch1:#$0048; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER H
  6428. (Unicode:#$24BE; Attr:daCircle; Ch1:#$0049; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER I
  6429. (Unicode:#$24BF; Attr:daCircle; Ch1:#$004A; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER J
  6430. (Unicode:#$24C0; Attr:daCircle; Ch1:#$004B; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER K
  6431. (Unicode:#$24C1; Attr:daCircle; Ch1:#$004C; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER L
  6432. (Unicode:#$24C2; Attr:daCircle; Ch1:#$004D; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER M
  6433. (Unicode:#$24C3; Attr:daCircle; Ch1:#$004E; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER N
  6434. (Unicode:#$24C4; Attr:daCircle; Ch1:#$004F; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER O
  6435. (Unicode:#$24C5; Attr:daCircle; Ch1:#$0050; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER P
  6436. (Unicode:#$24C6; Attr:daCircle; Ch1:#$0051; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER Q
  6437. (Unicode:#$24C7; Attr:daCircle; Ch1:#$0052; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER R
  6438. (Unicode:#$24C8; Attr:daCircle; Ch1:#$0053; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER S
  6439. (Unicode:#$24C9; Attr:daCircle; Ch1:#$0054; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER T
  6440. (Unicode:#$24CA; Attr:daCircle; Ch1:#$0055; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER U
  6441. (Unicode:#$24CB; Attr:daCircle; Ch1:#$0056; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER V
  6442. (Unicode:#$24CC; Attr:daCircle; Ch1:#$0057; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER W
  6443. (Unicode:#$24CD; Attr:daCircle; Ch1:#$0058; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER X
  6444. (Unicode:#$24CE; Attr:daCircle; Ch1:#$0059; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER Y
  6445. (Unicode:#$24CF; Attr:daCircle; Ch1:#$005A; Ch2:#$FFFF), // CIRCLED LATIN CAPITAL LETTER Z
  6446. (Unicode:#$24D0; Attr:daCircle; Ch1:#$0061; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER A
  6447. (Unicode:#$24D1; Attr:daCircle; Ch1:#$0062; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER B
  6448. (Unicode:#$24D2; Attr:daCircle; Ch1:#$0063; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER C
  6449. (Unicode:#$24D3; Attr:daCircle; Ch1:#$0064; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER D
  6450. (Unicode:#$24D4; Attr:daCircle; Ch1:#$0065; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER E
  6451. (Unicode:#$24D5; Attr:daCircle; Ch1:#$0066; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER F
  6452. (Unicode:#$24D6; Attr:daCircle; Ch1:#$0067; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER G
  6453. (Unicode:#$24D7; Attr:daCircle; Ch1:#$0068; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER H
  6454. (Unicode:#$24D8; Attr:daCircle; Ch1:#$0069; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER I
  6455. (Unicode:#$24D9; Attr:daCircle; Ch1:#$006A; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER J
  6456. (Unicode:#$24DA; Attr:daCircle; Ch1:#$006B; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER K
  6457. (Unicode:#$24DB; Attr:daCircle; Ch1:#$006C; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER L
  6458. (Unicode:#$24DC; Attr:daCircle; Ch1:#$006D; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER M
  6459. (Unicode:#$24DD; Attr:daCircle; Ch1:#$006E; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER N
  6460. (Unicode:#$24DE; Attr:daCircle; Ch1:#$006F; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER O
  6461. (Unicode:#$24DF; Attr:daCircle; Ch1:#$0070; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER P
  6462. (Unicode:#$24E0; Attr:daCircle; Ch1:#$0071; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER Q
  6463. (Unicode:#$24E1; Attr:daCircle; Ch1:#$0072; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER R
  6464. (Unicode:#$24E2; Attr:daCircle; Ch1:#$0073; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER S
  6465. (Unicode:#$24E3; Attr:daCircle; Ch1:#$0074; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER T
  6466. (Unicode:#$24E4; Attr:daCircle; Ch1:#$0075; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER U
  6467. (Unicode:#$24E5; Attr:daCircle; Ch1:#$0076; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER V
  6468. (Unicode:#$24E6; Attr:daCircle; Ch1:#$0077; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER W
  6469. (Unicode:#$24E7; Attr:daCircle; Ch1:#$0078; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER X
  6470. (Unicode:#$24E8; Attr:daCircle; Ch1:#$0079; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER Y
  6471. (Unicode:#$24E9; Attr:daCircle; Ch1:#$007A; Ch2:#$FFFF), // CIRCLED LATIN SMALL LETTER Z
  6472. (Unicode:#$24EA; Attr:daCircle; Ch1:#$0030; Ch2:#$FFFF), // CIRCLED DIGIT ZERO
  6473. (Unicode:#$2E9F; Attr:daCompat; Ch1:#$6BCD; Ch2:#$FFFF), // CJK RADICAL MOTHER
  6474. (Unicode:#$2EF3; Attr:daCompat; Ch1:#$9F9F; Ch2:#$FFFF), // CJK RADICAL C-SIMPLIFIED TURTLE
  6475. (Unicode:#$2F00; Attr:daCompat; Ch1:#$4E00; Ch2:#$FFFF), // KANGXI RADICAL ONE
  6476. (Unicode:#$2F01; Attr:daCompat; Ch1:#$4E28; Ch2:#$FFFF), // KANGXI RADICAL LINE
  6477. (Unicode:#$2F02; Attr:daCompat; Ch1:#$4E36; Ch2:#$FFFF), // KANGXI RADICAL DOT
  6478. (Unicode:#$2F03; Attr:daCompat; Ch1:#$4E3F; Ch2:#$FFFF), // KANGXI RADICAL SLASH
  6479. (Unicode:#$2F04; Attr:daCompat; Ch1:#$4E59; Ch2:#$FFFF), // KANGXI RADICAL SECOND
  6480. (Unicode:#$2F05; Attr:daCompat; Ch1:#$4E85; Ch2:#$FFFF), // KANGXI RADICAL HOOK
  6481. (Unicode:#$2F06; Attr:daCompat; Ch1:#$4E8C; Ch2:#$FFFF), // KANGXI RADICAL TWO
  6482. (Unicode:#$2F07; Attr:daCompat; Ch1:#$4EA0; Ch2:#$FFFF), // KANGXI RADICAL LID
  6483. (Unicode:#$2F08; Attr:daCompat; Ch1:#$4EBA; Ch2:#$FFFF), // KANGXI RADICAL MAN
  6484. (Unicode:#$2F09; Attr:daCompat; Ch1:#$513F; Ch2:#$FFFF), // KANGXI RADICAL LEGS
  6485. (Unicode:#$2F0A; Attr:daCompat; Ch1:#$5165; Ch2:#$FFFF), // KANGXI RADICAL ENTER
  6486. (Unicode:#$2F0B; Attr:daCompat; Ch1:#$516B; Ch2:#$FFFF), // KANGXI RADICAL EIGHT
  6487. (Unicode:#$2F0C; Attr:daCompat; Ch1:#$5182; Ch2:#$FFFF), // KANGXI RADICAL DOWN BOX
  6488. (Unicode:#$2F0D; Attr:daCompat; Ch1:#$5196; Ch2:#$FFFF), // KANGXI RADICAL COVER
  6489. (Unicode:#$2F0E; Attr:daCompat; Ch1:#$51AB; Ch2:#$FFFF), // KANGXI RADICAL ICE
  6490. (Unicode:#$2F0F; Attr:daCompat; Ch1:#$51E0; Ch2:#$FFFF), // KANGXI RADICAL TABLE
  6491. (Unicode:#$2F10; Attr:daCompat; Ch1:#$51F5; Ch2:#$FFFF), // KANGXI RADICAL OPEN BOX
  6492. (Unicode:#$2F11; Attr:daCompat; Ch1:#$5200; Ch2:#$FFFF), // KANGXI RADICAL KNIFE
  6493. (Unicode:#$2F12; Attr:daCompat; Ch1:#$529B; Ch2:#$FFFF), // KANGXI RADICAL POWER
  6494. (Unicode:#$2F13; Attr:daCompat; Ch1:#$52F9; Ch2:#$FFFF), // KANGXI RADICAL WRAP
  6495. (Unicode:#$2F14; Attr:daCompat; Ch1:#$5315; Ch2:#$FFFF), // KANGXI RADICAL SPOON
  6496. (Unicode:#$2F15; Attr:daCompat; Ch1:#$531A; Ch2:#$FFFF), // KANGXI RADICAL RIGHT OPEN BOX
  6497. (Unicode:#$2F16; Attr:daCompat; Ch1:#$5338; Ch2:#$FFFF), // KANGXI RADICAL HIDING ENCLOSURE
  6498. (Unicode:#$2F17; Attr:daCompat; Ch1:#$5341; Ch2:#$FFFF), // KANGXI RADICAL TEN
  6499. (Unicode:#$2F18; Attr:daCompat; Ch1:#$535C; Ch2:#$FFFF), // KANGXI RADICAL DIVINATION
  6500. (Unicode:#$2F19; Attr:daCompat; Ch1:#$5369; Ch2:#$FFFF), // KANGXI RADICAL SEAL
  6501. (Unicode:#$2F1A; Attr:daCompat; Ch1:#$5382; Ch2:#$FFFF), // KANGXI RADICAL CLIFF
  6502. (Unicode:#$2F1B; Attr:daCompat; Ch1:#$53B6; Ch2:#$FFFF), // KANGXI RADICAL PRIVATE
  6503. (Unicode:#$2F1C; Attr:daCompat; Ch1:#$53C8; Ch2:#$FFFF), // KANGXI RADICAL AGAIN
  6504. (Unicode:#$2F1D; Attr:daCompat; Ch1:#$53E3; Ch2:#$FFFF), // KANGXI RADICAL MOUTH
  6505. (Unicode:#$2F1E; Attr:daCompat; Ch1:#$56D7; Ch2:#$FFFF), // KANGXI RADICAL ENCLOSURE
  6506. (Unicode:#$2F1F; Attr:daCompat; Ch1:#$571F; Ch2:#$FFFF), // KANGXI RADICAL EARTH
  6507. (Unicode:#$2F20; Attr:daCompat; Ch1:#$58EB; Ch2:#$FFFF), // KANGXI RADICAL SCHOLAR
  6508. (Unicode:#$2F21; Attr:daCompat; Ch1:#$5902; Ch2:#$FFFF), // KANGXI RADICAL GO
  6509. (Unicode:#$2F22; Attr:daCompat; Ch1:#$590A; Ch2:#$FFFF), // KANGXI RADICAL GO SLOWLY
  6510. (Unicode:#$2F23; Attr:daCompat; Ch1:#$5915; Ch2:#$FFFF), // KANGXI RADICAL EVENING
  6511. (Unicode:#$2F24; Attr:daCompat; Ch1:#$5927; Ch2:#$FFFF), // KANGXI RADICAL BIG
  6512. (Unicode:#$2F25; Attr:daCompat; Ch1:#$5973; Ch2:#$FFFF), // KANGXI RADICAL WOMAN
  6513. (Unicode:#$2F26; Attr:daCompat; Ch1:#$5B50; Ch2:#$FFFF), // KANGXI RADICAL CHILD
  6514. (Unicode:#$2F27; Attr:daCompat; Ch1:#$5B80; Ch2:#$FFFF), // KANGXI RADICAL ROOF
  6515. (Unicode:#$2F28; Attr:daCompat; Ch1:#$5BF8; Ch2:#$FFFF), // KANGXI RADICAL INCH
  6516. (Unicode:#$2F29; Attr:daCompat; Ch1:#$5C0F; Ch2:#$FFFF), // KANGXI RADICAL SMALL
  6517. (Unicode:#$2F2A; Attr:daCompat; Ch1:#$5C22; Ch2:#$FFFF), // KANGXI RADICAL LAME
  6518. (Unicode:#$2F2B; Attr:daCompat; Ch1:#$5C38; Ch2:#$FFFF), // KANGXI RADICAL CORPSE
  6519. (Unicode:#$2F2C; Attr:daCompat; Ch1:#$5C6E; Ch2:#$FFFF), // KANGXI RADICAL SPROUT
  6520. (Unicode:#$2F2D; Attr:daCompat; Ch1:#$5C71; Ch2:#$FFFF), // KANGXI RADICAL MOUNTAIN
  6521. (Unicode:#$2F2E; Attr:daCompat; Ch1:#$5DDB; Ch2:#$FFFF), // KANGXI RADICAL RIVER
  6522. (Unicode:#$2F2F; Attr:daCompat; Ch1:#$5DE5; Ch2:#$FFFF), // KANGXI RADICAL WORK
  6523. (Unicode:#$2F30; Attr:daCompat; Ch1:#$5DF1; Ch2:#$FFFF), // KANGXI RADICAL ONESELF
  6524. (Unicode:#$2F31; Attr:daCompat; Ch1:#$5DFE; Ch2:#$FFFF), // KANGXI RADICAL TURBAN
  6525. (Unicode:#$2F32; Attr:daCompat; Ch1:#$5E72; Ch2:#$FFFF), // KANGXI RADICAL DRY
  6526. (Unicode:#$2F33; Attr:daCompat; Ch1:#$5E7A; Ch2:#$FFFF), // KANGXI RADICAL SHORT THREAD
  6527. (Unicode:#$2F34; Attr:daCompat; Ch1:#$5E7F; Ch2:#$FFFF), // KANGXI RADICAL DOTTED CLIFF
  6528. (Unicode:#$2F35; Attr:daCompat; Ch1:#$5EF4; Ch2:#$FFFF), // KANGXI RADICAL LONG STRIDE
  6529. (Unicode:#$2F36; Attr:daCompat; Ch1:#$5EFE; Ch2:#$FFFF), // KANGXI RADICAL TWO HANDS
  6530. (Unicode:#$2F37; Attr:daCompat; Ch1:#$5F0B; Ch2:#$FFFF), // KANGXI RADICAL SHOOT
  6531. (Unicode:#$2F38; Attr:daCompat; Ch1:#$5F13; Ch2:#$FFFF), // KANGXI RADICAL BOW
  6532. (Unicode:#$2F39; Attr:daCompat; Ch1:#$5F50; Ch2:#$FFFF), // KANGXI RADICAL SNOUT
  6533. (Unicode:#$2F3A; Attr:daCompat; Ch1:#$5F61; Ch2:#$FFFF), // KANGXI RADICAL BRISTLE
  6534. (Unicode:#$2F3B; Attr:daCompat; Ch1:#$5F73; Ch2:#$FFFF), // KANGXI RADICAL STEP
  6535. (Unicode:#$2F3C; Attr:daCompat; Ch1:#$5FC3; Ch2:#$FFFF), // KANGXI RADICAL HEART
  6536. (Unicode:#$2F3D; Attr:daCompat; Ch1:#$6208; Ch2:#$FFFF), // KANGXI RADICAL HALBERD
  6537. (Unicode:#$2F3E; Attr:daCompat; Ch1:#$6236; Ch2:#$FFFF), // KANGXI RADICAL DOOR
  6538. (Unicode:#$2F3F; Attr:daCompat; Ch1:#$624B; Ch2:#$FFFF), // KANGXI RADICAL HAND
  6539. (Unicode:#$2F40; Attr:daCompat; Ch1:#$652F; Ch2:#$FFFF), // KANGXI RADICAL BRANCH
  6540. (Unicode:#$2F41; Attr:daCompat; Ch1:#$6534; Ch2:#$FFFF), // KANGXI RADICAL RAP
  6541. (Unicode:#$2F42; Attr:daCompat; Ch1:#$6587; Ch2:#$FFFF), // KANGXI RADICAL SCRIPT
  6542. (Unicode:#$2F43; Attr:daCompat; Ch1:#$6597; Ch2:#$FFFF), // KANGXI RADICAL DIPPER
  6543. (Unicode:#$2F44; Attr:daCompat; Ch1:#$65A4; Ch2:#$FFFF), // KANGXI RADICAL AXE
  6544. (Unicode:#$2F45; Attr:daCompat; Ch1:#$65B9; Ch2:#$FFFF), // KANGXI RADICAL SQUARE
  6545. (Unicode:#$2F46; Attr:daCompat; Ch1:#$65E0; Ch2:#$FFFF), // KANGXI RADICAL NOT
  6546. (Unicode:#$2F47; Attr:daCompat; Ch1:#$65E5; Ch2:#$FFFF), // KANGXI RADICAL SUN
  6547. (Unicode:#$2F48; Attr:daCompat; Ch1:#$66F0; Ch2:#$FFFF), // KANGXI RADICAL SAY
  6548. (Unicode:#$2F49; Attr:daCompat; Ch1:#$6708; Ch2:#$FFFF), // KANGXI RADICAL MOON
  6549. (Unicode:#$2F4A; Attr:daCompat; Ch1:#$6728; Ch2:#$FFFF), // KANGXI RADICAL TREE
  6550. (Unicode:#$2F4B; Attr:daCompat; Ch1:#$6B20; Ch2:#$FFFF), // KANGXI RADICAL LACK
  6551. (Unicode:#$2F4C; Attr:daCompat; Ch1:#$6B62; Ch2:#$FFFF), // KANGXI RADICAL STOP
  6552. (Unicode:#$2F4D; Attr:daCompat; Ch1:#$6B79; Ch2:#$FFFF), // KANGXI RADICAL DEATH
  6553. (Unicode:#$2F4E; Attr:daCompat; Ch1:#$6BB3; Ch2:#$FFFF), // KANGXI RADICAL WEAPON
  6554. (Unicode:#$2F4F; Attr:daCompat; Ch1:#$6BCB; Ch2:#$FFFF), // KANGXI RADICAL DO NOT
  6555. (Unicode:#$2F50; Attr:daCompat; Ch1:#$6BD4; Ch2:#$FFFF), // KANGXI RADICAL COMPARE
  6556. (Unicode:#$2F51; Attr:daCompat; Ch1:#$6BDB; Ch2:#$FFFF), // KANGXI RADICAL FUR
  6557. (Unicode:#$2F52; Attr:daCompat; Ch1:#$6C0F; Ch2:#$FFFF), // KANGXI RADICAL CLAN
  6558. (Unicode:#$2F53; Attr:daCompat; Ch1:#$6C14; Ch2:#$FFFF), // KANGXI RADICAL STEAM
  6559. (Unicode:#$2F54; Attr:daCompat; Ch1:#$6C34; Ch2:#$FFFF), // KANGXI RADICAL WATER
  6560. (Unicode:#$2F55; Attr:daCompat; Ch1:#$706B; Ch2:#$FFFF), // KANGXI RADICAL FIRE
  6561. (Unicode:#$2F56; Attr:daCompat; Ch1:#$722A; Ch2:#$FFFF), // KANGXI RADICAL CLAW
  6562. (Unicode:#$2F57; Attr:daCompat; Ch1:#$7236; Ch2:#$FFFF), // KANGXI RADICAL FATHER
  6563. (Unicode:#$2F58; Attr:daCompat; Ch1:#$723B; Ch2:#$FFFF), // KANGXI RADICAL DOUBLE X
  6564. (Unicode:#$2F59; Attr:daCompat; Ch1:#$723F; Ch2:#$FFFF), // KANGXI RADICAL HALF TREE TRUNK
  6565. (Unicode:#$2F5A; Attr:daCompat; Ch1:#$7247; Ch2:#$FFFF), // KANGXI RADICAL SLICE
  6566. (Unicode:#$2F5B; Attr:daCompat; Ch1:#$7259; Ch2:#$FFFF), // KANGXI RADICAL FANG
  6567. (Unicode:#$2F5C; Attr:daCompat; Ch1:#$725B; Ch2:#$FFFF), // KANGXI RADICAL COW
  6568. (Unicode:#$2F5D; Attr:daCompat; Ch1:#$72AC; Ch2:#$FFFF), // KANGXI RADICAL DOG
  6569. (Unicode:#$2F5E; Attr:daCompat; Ch1:#$7384; Ch2:#$FFFF), // KANGXI RADICAL PROFOUND
  6570. (Unicode:#$2F5F; Attr:daCompat; Ch1:#$7389; Ch2:#$FFFF), // KANGXI RADICAL JADE
  6571. (Unicode:#$2F60; Attr:daCompat; Ch1:#$74DC; Ch2:#$FFFF), // KANGXI RADICAL MELON
  6572. (Unicode:#$2F61; Attr:daCompat; Ch1:#$74E6; Ch2:#$FFFF), // KANGXI RADICAL TILE
  6573. (Unicode:#$2F62; Attr:daCompat; Ch1:#$7518; Ch2:#$FFFF), // KANGXI RADICAL SWEET
  6574. (Unicode:#$2F63; Attr:daCompat; Ch1:#$751F; Ch2:#$FFFF), // KANGXI RADICAL LIFE
  6575. (Unicode:#$2F64; Attr:daCompat; Ch1:#$7528; Ch2:#$FFFF), // KANGXI RADICAL USE
  6576. (Unicode:#$2F65; Attr:daCompat; Ch1:#$7530; Ch2:#$FFFF), // KANGXI RADICAL FIELD
  6577. (Unicode:#$2F66; Attr:daCompat; Ch1:#$758B; Ch2:#$FFFF), // KANGXI RADICAL BOLT OF CLOTH
  6578. (Unicode:#$2F67; Attr:daCompat; Ch1:#$7592; Ch2:#$FFFF), // KANGXI RADICAL SICKNESS
  6579. (Unicode:#$2F68; Attr:daCompat; Ch1:#$7676; Ch2:#$FFFF), // KANGXI RADICAL DOTTED TENT
  6580. (Unicode:#$2F69; Attr:daCompat; Ch1:#$767D; Ch2:#$FFFF), // KANGXI RADICAL WHITE
  6581. (Unicode:#$2F6A; Attr:daCompat; Ch1:#$76AE; Ch2:#$FFFF), // KANGXI RADICAL SKIN
  6582. (Unicode:#$2F6B; Attr:daCompat; Ch1:#$76BF; Ch2:#$FFFF), // KANGXI RADICAL DISH
  6583. (Unicode:#$2F6C; Attr:daCompat; Ch1:#$76EE; Ch2:#$FFFF), // KANGXI RADICAL EYE
  6584. (Unicode:#$2F6D; Attr:daCompat; Ch1:#$77DB; Ch2:#$FFFF), // KANGXI RADICAL SPEAR
  6585. (Unicode:#$2F6E; Attr:daCompat; Ch1:#$77E2; Ch2:#$FFFF), // KANGXI RADICAL ARROW
  6586. (Unicode:#$2F6F; Attr:daCompat; Ch1:#$77F3; Ch2:#$FFFF), // KANGXI RADICAL STONE
  6587. (Unicode:#$2F70; Attr:daCompat; Ch1:#$793A; Ch2:#$FFFF), // KANGXI RADICAL SPIRIT
  6588. (Unicode:#$2F71; Attr:daCompat; Ch1:#$79B8; Ch2:#$FFFF), // KANGXI RADICAL TRACK
  6589. (Unicode:#$2F72; Attr:daCompat; Ch1:#$79BE; Ch2:#$FFFF), // KANGXI RADICAL GRAIN
  6590. (Unicode:#$2F73; Attr:daCompat; Ch1:#$7A74; Ch2:#$FFFF), // KANGXI RADICAL CAVE
  6591. (Unicode:#$2F74; Attr:daCompat; Ch1:#$7ACB; Ch2:#$FFFF), // KANGXI RADICAL STAND
  6592. (Unicode:#$2F75; Attr:daCompat; Ch1:#$7AF9; Ch2:#$FFFF), // KANGXI RADICAL BAMBOO
  6593. (Unicode:#$2F76; Attr:daCompat; Ch1:#$7C73; Ch2:#$FFFF), // KANGXI RADICAL RICE
  6594. (Unicode:#$2F77; Attr:daCompat; Ch1:#$7CF8; Ch2:#$FFFF), // KANGXI RADICAL SILK
  6595. (Unicode:#$2F78; Attr:daCompat; Ch1:#$7F36; Ch2:#$FFFF), // KANGXI RADICAL JAR
  6596. (Unicode:#$2F79; Attr:daCompat; Ch1:#$7F51; Ch2:#$FFFF), // KANGXI RADICAL NET
  6597. (Unicode:#$2F7A; Attr:daCompat; Ch1:#$7F8A; Ch2:#$FFFF), // KANGXI RADICAL SHEEP
  6598. (Unicode:#$2F7B; Attr:daCompat; Ch1:#$7FBD; Ch2:#$FFFF), // KANGXI RADICAL FEATHER
  6599. (Unicode:#$2F7C; Attr:daCompat; Ch1:#$8001; Ch2:#$FFFF), // KANGXI RADICAL OLD
  6600. (Unicode:#$2F7D; Attr:daCompat; Ch1:#$800C; Ch2:#$FFFF), // KANGXI RADICAL AND
  6601. (Unicode:#$2F7E; Attr:daCompat; Ch1:#$8012; Ch2:#$FFFF), // KANGXI RADICAL PLOW
  6602. (Unicode:#$2F7F; Attr:daCompat; Ch1:#$8033; Ch2:#$FFFF), // KANGXI RADICAL EAR
  6603. (Unicode:#$2F80; Attr:daCompat; Ch1:#$807F; Ch2:#$FFFF), // KANGXI RADICAL BRUSH
  6604. (Unicode:#$2F81; Attr:daCompat; Ch1:#$8089; Ch2:#$FFFF), // KANGXI RADICAL MEAT
  6605. (Unicode:#$2F82; Attr:daCompat; Ch1:#$81E3; Ch2:#$FFFF), // KANGXI RADICAL MINISTER
  6606. (Unicode:#$2F83; Attr:daCompat; Ch1:#$81EA; Ch2:#$FFFF), // KANGXI RADICAL SELF
  6607. (Unicode:#$2F84; Attr:daCompat; Ch1:#$81F3; Ch2:#$FFFF), // KANGXI RADICAL ARRIVE
  6608. (Unicode:#$2F85; Attr:daCompat; Ch1:#$81FC; Ch2:#$FFFF), // KANGXI RADICAL MORTAR
  6609. (Unicode:#$2F86; Attr:daCompat; Ch1:#$820C; Ch2:#$FFFF), // KANGXI RADICAL TONGUE
  6610. (Unicode:#$2F87; Attr:daCompat; Ch1:#$821B; Ch2:#$FFFF), // KANGXI RADICAL OPPOSE
  6611. (Unicode:#$2F88; Attr:daCompat; Ch1:#$821F; Ch2:#$FFFF), // KANGXI RADICAL BOAT
  6612. (Unicode:#$2F89; Attr:daCompat; Ch1:#$826E; Ch2:#$FFFF), // KANGXI RADICAL STOPPING
  6613. (Unicode:#$2F8A; Attr:daCompat; Ch1:#$8272; Ch2:#$FFFF), // KANGXI RADICAL COLOR
  6614. (Unicode:#$2F8B; Attr:daCompat; Ch1:#$8278; Ch2:#$FFFF), // KANGXI RADICAL GRASS
  6615. (Unicode:#$2F8C; Attr:daCompat; Ch1:#$864D; Ch2:#$FFFF), // KANGXI RADICAL TIGER
  6616. (Unicode:#$2F8D; Attr:daCompat; Ch1:#$866B; Ch2:#$FFFF), // KANGXI RADICAL INSECT
  6617. (Unicode:#$2F8E; Attr:daCompat; Ch1:#$8840; Ch2:#$FFFF), // KANGXI RADICAL BLOOD
  6618. (Unicode:#$2F8F; Attr:daCompat; Ch1:#$884C; Ch2:#$FFFF), // KANGXI RADICAL WALK ENCLOSURE
  6619. (Unicode:#$2F90; Attr:daCompat; Ch1:#$8863; Ch2:#$FFFF), // KANGXI RADICAL CLOTHES
  6620. (Unicode:#$2F91; Attr:daCompat; Ch1:#$897E; Ch2:#$FFFF), // KANGXI RADICAL WEST
  6621. (Unicode:#$2F92; Attr:daCompat; Ch1:#$898B; Ch2:#$FFFF), // KANGXI RADICAL SEE
  6622. (Unicode:#$2F93; Attr:daCompat; Ch1:#$89D2; Ch2:#$FFFF), // KANGXI RADICAL HORN
  6623. (Unicode:#$2F94; Attr:daCompat; Ch1:#$8A00; Ch2:#$FFFF), // KANGXI RADICAL SPEECH
  6624. (Unicode:#$2F95; Attr:daCompat; Ch1:#$8C37; Ch2:#$FFFF), // KANGXI RADICAL VALLEY
  6625. (Unicode:#$2F96; Attr:daCompat; Ch1:#$8C46; Ch2:#$FFFF), // KANGXI RADICAL BEAN
  6626. (Unicode:#$2F97; Attr:daCompat; Ch1:#$8C55; Ch2:#$FFFF), // KANGXI RADICAL PIG
  6627. (Unicode:#$2F98; Attr:daCompat; Ch1:#$8C78; Ch2:#$FFFF), // KANGXI RADICAL BADGER
  6628. (Unicode:#$2F99; Attr:daCompat; Ch1:#$8C9D; Ch2:#$FFFF), // KANGXI RADICAL SHELL
  6629. (Unicode:#$2F9A; Attr:daCompat; Ch1:#$8D64; Ch2:#$FFFF), // KANGXI RADICAL RED
  6630. (Unicode:#$2F9B; Attr:daCompat; Ch1:#$8D70; Ch2:#$FFFF), // KANGXI RADICAL RUN
  6631. (Unicode:#$2F9C; Attr:daCompat; Ch1:#$8DB3; Ch2:#$FFFF), // KANGXI RADICAL FOOT
  6632. (Unicode:#$2F9D; Attr:daCompat; Ch1:#$8EAB; Ch2:#$FFFF), // KANGXI RADICAL BODY
  6633. (Unicode:#$2F9E; Attr:daCompat; Ch1:#$8ECA; Ch2:#$FFFF), // KANGXI RADICAL CART
  6634. (Unicode:#$2F9F; Attr:daCompat; Ch1:#$8F9B; Ch2:#$FFFF), // KANGXI RADICAL BITTER
  6635. (Unicode:#$2FA0; Attr:daCompat; Ch1:#$8FB0; Ch2:#$FFFF), // KANGXI RADICAL MORNING
  6636. (Unicode:#$2FA1; Attr:daCompat; Ch1:#$8FB5; Ch2:#$FFFF), // KANGXI RADICAL WALK
  6637. (Unicode:#$2FA2; Attr:daCompat; Ch1:#$9091; Ch2:#$FFFF), // KANGXI RADICAL CITY
  6638. (Unicode:#$2FA3; Attr:daCompat; Ch1:#$9149; Ch2:#$FFFF), // KANGXI RADICAL WINE
  6639. (Unicode:#$2FA4; Attr:daCompat; Ch1:#$91C6; Ch2:#$FFFF), // KANGXI RADICAL DISTINGUISH
  6640. (Unicode:#$2FA5; Attr:daCompat; Ch1:#$91CC; Ch2:#$FFFF), // KANGXI RADICAL VILLAGE
  6641. (Unicode:#$2FA6; Attr:daCompat; Ch1:#$91D1; Ch2:#$FFFF), // KANGXI RADICAL GOLD
  6642. (Unicode:#$2FA7; Attr:daCompat; Ch1:#$9577; Ch2:#$FFFF), // KANGXI RADICAL LONG
  6643. (Unicode:#$2FA8; Attr:daCompat; Ch1:#$9580; Ch2:#$FFFF), // KANGXI RADICAL GATE
  6644. (Unicode:#$2FA9; Attr:daCompat; Ch1:#$961C; Ch2:#$FFFF), // KANGXI RADICAL MOUND
  6645. (Unicode:#$2FAA; Attr:daCompat; Ch1:#$96B6; Ch2:#$FFFF), // KANGXI RADICAL SLAVE
  6646. (Unicode:#$2FAB; Attr:daCompat; Ch1:#$96B9; Ch2:#$FFFF), // KANGXI RADICAL SHORT TAILED BIRD
  6647. (Unicode:#$2FAC; Attr:daCompat; Ch1:#$96E8; Ch2:#$FFFF), // KANGXI RADICAL RAIN
  6648. (Unicode:#$2FAD; Attr:daCompat; Ch1:#$9751; Ch2:#$FFFF), // KANGXI RADICAL BLUE
  6649. (Unicode:#$2FAE; Attr:daCompat; Ch1:#$975E; Ch2:#$FFFF), // KANGXI RADICAL WRONG
  6650. (Unicode:#$2FAF; Attr:daCompat; Ch1:#$9762; Ch2:#$FFFF), // KANGXI RADICAL FACE
  6651. (Unicode:#$2FB0; Attr:daCompat; Ch1:#$9769; Ch2:#$FFFF), // KANGXI RADICAL LEATHER
  6652. (Unicode:#$2FB1; Attr:daCompat; Ch1:#$97CB; Ch2:#$FFFF), // KANGXI RADICAL TANNED LEATHER
  6653. (Unicode:#$2FB2; Attr:daCompat; Ch1:#$97ED; Ch2:#$FFFF), // KANGXI RADICAL LEEK
  6654. (Unicode:#$2FB3; Attr:daCompat; Ch1:#$97F3; Ch2:#$FFFF), // KANGXI RADICAL SOUND
  6655. (Unicode:#$2FB4; Attr:daCompat; Ch1:#$9801; Ch2:#$FFFF), // KANGXI RADICAL LEAF
  6656. (Unicode:#$2FB5; Attr:daCompat; Ch1:#$98A8; Ch2:#$FFFF), // KANGXI RADICAL WIND
  6657. (Unicode:#$2FB6; Attr:daCompat; Ch1:#$98DB; Ch2:#$FFFF), // KANGXI RADICAL FLY
  6658. (Unicode:#$2FB7; Attr:daCompat; Ch1:#$98DF; Ch2:#$FFFF), // KANGXI RADICAL EAT
  6659. (Unicode:#$2FB8; Attr:daCompat; Ch1:#$9996; Ch2:#$FFFF), // KANGXI RADICAL HEAD
  6660. (Unicode:#$2FB9; Attr:daCompat; Ch1:#$9999; Ch2:#$FFFF), // KANGXI RADICAL FRAGRANT
  6661. (Unicode:#$2FBA; Attr:daCompat; Ch1:#$99AC; Ch2:#$FFFF), // KANGXI RADICAL HORSE
  6662. (Unicode:#$2FBB; Attr:daCompat; Ch1:#$9AA8; Ch2:#$FFFF), // KANGXI RADICAL BONE
  6663. (Unicode:#$2FBC; Attr:daCompat; Ch1:#$9AD8; Ch2:#$FFFF), // KANGXI RADICAL TALL
  6664. (Unicode:#$2FBD; Attr:daCompat; Ch1:#$9ADF; Ch2:#$FFFF), // KANGXI RADICAL HAIR
  6665. (Unicode:#$2FBE; Attr:daCompat; Ch1:#$9B25; Ch2:#$FFFF), // KANGXI RADICAL FIGHT
  6666. (Unicode:#$2FBF; Attr:daCompat; Ch1:#$9B2F; Ch2:#$FFFF), // KANGXI RADICAL SACRIFICIAL WINE
  6667. (Unicode:#$2FC0; Attr:daCompat; Ch1:#$9B32; Ch2:#$FFFF), // KANGXI RADICAL CAULDRON
  6668. (Unicode:#$2FC1; Attr:daCompat; Ch1:#$9B3C; Ch2:#$FFFF), // KANGXI RADICAL GHOST
  6669. (Unicode:#$2FC2; Attr:daCompat; Ch1:#$9B5A; Ch2:#$FFFF), // KANGXI RADICAL FISH
  6670. (Unicode:#$2FC3; Attr:daCompat; Ch1:#$9CE5; Ch2:#$FFFF), // KANGXI RADICAL BIRD
  6671. (Unicode:#$2FC4; Attr:daCompat; Ch1:#$9E75; Ch2:#$FFFF), // KANGXI RADICAL SALT
  6672. (Unicode:#$2FC5; Attr:daCompat; Ch1:#$9E7F; Ch2:#$FFFF), // KANGXI RADICAL DEER
  6673. (Unicode:#$2FC6; Attr:daCompat; Ch1:#$9EA5; Ch2:#$FFFF), // KANGXI RADICAL WHEAT
  6674. (Unicode:#$2FC7; Attr:daCompat; Ch1:#$9EBB; Ch2:#$FFFF), // KANGXI RADICAL HEMP
  6675. (Unicode:#$2FC8; Attr:daCompat; Ch1:#$9EC3; Ch2:#$FFFF), // KANGXI RADICAL YELLOW
  6676. (Unicode:#$2FC9; Attr:daCompat; Ch1:#$9ECD; Ch2:#$FFFF), // KANGXI RADICAL MILLET
  6677. (Unicode:#$2FCA; Attr:daCompat; Ch1:#$9ED1; Ch2:#$FFFF), // KANGXI RADICAL BLACK
  6678. (Unicode:#$2FCB; Attr:daCompat; Ch1:#$9EF9; Ch2:#$FFFF), // KANGXI RADICAL EMBROIDERY
  6679. (Unicode:#$2FCC; Attr:daCompat; Ch1:#$9EFD; Ch2:#$FFFF), // KANGXI RADICAL FROG
  6680. (Unicode:#$2FCD; Attr:daCompat; Ch1:#$9F0E; Ch2:#$FFFF), // KANGXI RADICAL TRIPOD
  6681. (Unicode:#$2FCE; Attr:daCompat; Ch1:#$9F13; Ch2:#$FFFF), // KANGXI RADICAL DRUM
  6682. (Unicode:#$2FCF; Attr:daCompat; Ch1:#$9F20; Ch2:#$FFFF), // KANGXI RADICAL RAT
  6683. (Unicode:#$2FD0; Attr:daCompat; Ch1:#$9F3B; Ch2:#$FFFF), // KANGXI RADICAL NOSE
  6684. (Unicode:#$2FD1; Attr:daCompat; Ch1:#$9F4A; Ch2:#$FFFF), // KANGXI RADICAL EVEN
  6685. (Unicode:#$2FD2; Attr:daCompat; Ch1:#$9F52; Ch2:#$FFFF), // KANGXI RADICAL TOOTH
  6686. (Unicode:#$2FD3; Attr:daCompat; Ch1:#$9F8D; Ch2:#$FFFF), // KANGXI RADICAL DRAGON
  6687. (Unicode:#$2FD4; Attr:daCompat; Ch1:#$9F9C; Ch2:#$FFFF), // KANGXI RADICAL TURTLE
  6688. (Unicode:#$2FD5; Attr:daCompat; Ch1:#$9FA0; Ch2:#$FFFF), // KANGXI RADICAL FLUTE
  6689. (Unicode:#$3000; Attr:daWide; Ch1:#$0020; Ch2:#$FFFF), // IDEOGRAPHIC SPACE
  6690. (Unicode:#$3036; Attr:daCompat; Ch1:#$3012; Ch2:#$FFFF), // CIRCLED POSTAL MARK
  6691. (Unicode:#$3038; Attr:daCompat; Ch1:#$5341; Ch2:#$FFFF), // HANGZHOU NUMERAL TEN
  6692. (Unicode:#$3039; Attr:daCompat; Ch1:#$5344; Ch2:#$FFFF), // HANGZHOU NUMERAL TWENTY
  6693. (Unicode:#$303A; Attr:daCompat; Ch1:#$5345; Ch2:#$FFFF), // HANGZHOU NUMERAL THIRTY
  6694. (Unicode:#$304C; Attr:daNone; Ch1:#$304B; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER GA
  6695. (Unicode:#$304E; Attr:daNone; Ch1:#$304D; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER GI
  6696. (Unicode:#$3050; Attr:daNone; Ch1:#$304F; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER GU
  6697. (Unicode:#$3052; Attr:daNone; Ch1:#$3051; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER GE
  6698. (Unicode:#$3054; Attr:daNone; Ch1:#$3053; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER GO
  6699. (Unicode:#$3056; Attr:daNone; Ch1:#$3055; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER ZA
  6700. (Unicode:#$3058; Attr:daNone; Ch1:#$3057; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER ZI
  6701. (Unicode:#$305A; Attr:daNone; Ch1:#$3059; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER ZU
  6702. (Unicode:#$305C; Attr:daNone; Ch1:#$305B; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER ZE
  6703. (Unicode:#$305E; Attr:daNone; Ch1:#$305D; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER ZO
  6704. (Unicode:#$3060; Attr:daNone; Ch1:#$305F; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER DA
  6705. (Unicode:#$3062; Attr:daNone; Ch1:#$3061; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER DI
  6706. (Unicode:#$3065; Attr:daNone; Ch1:#$3064; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER DU
  6707. (Unicode:#$3067; Attr:daNone; Ch1:#$3066; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER DE
  6708. (Unicode:#$3069; Attr:daNone; Ch1:#$3068; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER DO
  6709. (Unicode:#$3070; Attr:daNone; Ch1:#$306F; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER BA
  6710. (Unicode:#$3071; Attr:daNone; Ch1:#$306F; Ch2:#$309A; Ch3:#$FFFF), // HIRAGANA LETTER PA
  6711. (Unicode:#$3073; Attr:daNone; Ch1:#$3072; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER BI
  6712. (Unicode:#$3074; Attr:daNone; Ch1:#$3072; Ch2:#$309A; Ch3:#$FFFF), // HIRAGANA LETTER PI
  6713. (Unicode:#$3076; Attr:daNone; Ch1:#$3075; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER BU
  6714. (Unicode:#$3077; Attr:daNone; Ch1:#$3075; Ch2:#$309A; Ch3:#$FFFF), // HIRAGANA LETTER PU
  6715. (Unicode:#$3079; Attr:daNone; Ch1:#$3078; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER BE
  6716. (Unicode:#$307A; Attr:daNone; Ch1:#$3078; Ch2:#$309A; Ch3:#$FFFF), // HIRAGANA LETTER PE
  6717. (Unicode:#$307C; Attr:daNone; Ch1:#$307B; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER BO
  6718. (Unicode:#$307D; Attr:daNone; Ch1:#$307B; Ch2:#$309A; Ch3:#$FFFF), // HIRAGANA LETTER PO
  6719. (Unicode:#$3094; Attr:daNone; Ch1:#$3046; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA LETTER VU
  6720. (Unicode:#$309B; Attr:daCompat; Ch1:#$0020; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA-HIRAGANA VOICED SOUND MARK
  6721. (Unicode:#$309C; Attr:daCompat; Ch1:#$0020; Ch2:#$309A; Ch3:#$FFFF), // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
  6722. (Unicode:#$309E; Attr:daNone; Ch1:#$309D; Ch2:#$3099; Ch3:#$FFFF), // HIRAGANA VOICED ITERATION MARK
  6723. (Unicode:#$30AC; Attr:daNone; Ch1:#$30AB; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER GA
  6724. (Unicode:#$30AE; Attr:daNone; Ch1:#$30AD; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER GI
  6725. (Unicode:#$30B0; Attr:daNone; Ch1:#$30AF; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER GU
  6726. (Unicode:#$30B2; Attr:daNone; Ch1:#$30B1; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER GE
  6727. (Unicode:#$30B4; Attr:daNone; Ch1:#$30B3; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER GO
  6728. (Unicode:#$30B6; Attr:daNone; Ch1:#$30B5; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER ZA
  6729. (Unicode:#$30B8; Attr:daNone; Ch1:#$30B7; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER ZI
  6730. (Unicode:#$30BA; Attr:daNone; Ch1:#$30B9; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER ZU
  6731. (Unicode:#$30BC; Attr:daNone; Ch1:#$30BB; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER ZE
  6732. (Unicode:#$30BE; Attr:daNone; Ch1:#$30BD; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER ZO
  6733. (Unicode:#$30C0; Attr:daNone; Ch1:#$30BF; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER DA
  6734. (Unicode:#$30C2; Attr:daNone; Ch1:#$30C1; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER DI
  6735. (Unicode:#$30C5; Attr:daNone; Ch1:#$30C4; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER DU
  6736. (Unicode:#$30C7; Attr:daNone; Ch1:#$30C6; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER DE
  6737. (Unicode:#$30C9; Attr:daNone; Ch1:#$30C8; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER DO
  6738. (Unicode:#$30D0; Attr:daNone; Ch1:#$30CF; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER BA
  6739. (Unicode:#$30D1; Attr:daNone; Ch1:#$30CF; Ch2:#$309A; Ch3:#$FFFF), // KATAKANA LETTER PA
  6740. (Unicode:#$30D3; Attr:daNone; Ch1:#$30D2; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER BI
  6741. (Unicode:#$30D4; Attr:daNone; Ch1:#$30D2; Ch2:#$309A; Ch3:#$FFFF), // KATAKANA LETTER PI
  6742. (Unicode:#$30D6; Attr:daNone; Ch1:#$30D5; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER BU
  6743. (Unicode:#$30D7; Attr:daNone; Ch1:#$30D5; Ch2:#$309A; Ch3:#$FFFF), // KATAKANA LETTER PU
  6744. (Unicode:#$30D9; Attr:daNone; Ch1:#$30D8; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER BE
  6745. (Unicode:#$30DA; Attr:daNone; Ch1:#$30D8; Ch2:#$309A; Ch3:#$FFFF), // KATAKANA LETTER PE
  6746. (Unicode:#$30DC; Attr:daNone; Ch1:#$30DB; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER BO
  6747. (Unicode:#$30DD; Attr:daNone; Ch1:#$30DB; Ch2:#$309A; Ch3:#$FFFF), // KATAKANA LETTER PO
  6748. (Unicode:#$30F4; Attr:daNone; Ch1:#$30A6; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER VU
  6749. (Unicode:#$30F7; Attr:daNone; Ch1:#$30EF; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER VA
  6750. (Unicode:#$30F8; Attr:daNone; Ch1:#$30F0; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER VI
  6751. (Unicode:#$30F9; Attr:daNone; Ch1:#$30F1; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER VE
  6752. (Unicode:#$30FA; Attr:daNone; Ch1:#$30F2; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA LETTER VO
  6753. (Unicode:#$30FE; Attr:daNone; Ch1:#$30FD; Ch2:#$3099; Ch3:#$FFFF), // KATAKANA VOICED ITERATION MARK
  6754. (Unicode:#$3131; Attr:daCompat; Ch1:#$1100; Ch2:#$FFFF), // HANGUL LETTER KIYEOK
  6755. (Unicode:#$3132; Attr:daCompat; Ch1:#$1101; Ch2:#$FFFF), // HANGUL LETTER SSANGKIYEOK
  6756. (Unicode:#$3133; Attr:daCompat; Ch1:#$11AA; Ch2:#$FFFF), // HANGUL LETTER KIYEOK-SIOS
  6757. (Unicode:#$3134; Attr:daCompat; Ch1:#$1102; Ch2:#$FFFF), // HANGUL LETTER NIEUN
  6758. (Unicode:#$3135; Attr:daCompat; Ch1:#$11AC; Ch2:#$FFFF), // HANGUL LETTER NIEUN-CIEUC
  6759. (Unicode:#$3136; Attr:daCompat; Ch1:#$11AD; Ch2:#$FFFF), // HANGUL LETTER NIEUN-HIEUH
  6760. (Unicode:#$3137; Attr:daCompat; Ch1:#$1103; Ch2:#$FFFF), // HANGUL LETTER TIKEUT
  6761. (Unicode:#$3138; Attr:daCompat; Ch1:#$1104; Ch2:#$FFFF), // HANGUL LETTER SSANGTIKEUT
  6762. (Unicode:#$3139; Attr:daCompat; Ch1:#$1105; Ch2:#$FFFF), // HANGUL LETTER RIEUL
  6763. (Unicode:#$313A; Attr:daCompat; Ch1:#$11B0; Ch2:#$FFFF), // HANGUL LETTER RIEUL-KIYEOK
  6764. (Unicode:#$313B; Attr:daCompat; Ch1:#$11B1; Ch2:#$FFFF), // HANGUL LETTER RIEUL-MIEUM
  6765. (Unicode:#$313C; Attr:daCompat; Ch1:#$11B2; Ch2:#$FFFF), // HANGUL LETTER RIEUL-PIEUP
  6766. (Unicode:#$313D; Attr:daCompat; Ch1:#$11B3; Ch2:#$FFFF), // HANGUL LETTER RIEUL-SIOS
  6767. (Unicode:#$313E; Attr:daCompat; Ch1:#$11B4; Ch2:#$FFFF), // HANGUL LETTER RIEUL-THIEUTH
  6768. (Unicode:#$313F; Attr:daCompat; Ch1:#$11B5; Ch2:#$FFFF), // HANGUL LETTER RIEUL-PHIEUPH
  6769. (Unicode:#$3140; Attr:daCompat; Ch1:#$111A; Ch2:#$FFFF), // HANGUL LETTER RIEUL-HIEUH
  6770. (Unicode:#$3141; Attr:daCompat; Ch1:#$1106; Ch2:#$FFFF), // HANGUL LETTER MIEUM
  6771. (Unicode:#$3142; Attr:daCompat; Ch1:#$1107; Ch2:#$FFFF), // HANGUL LETTER PIEUP
  6772. (Unicode:#$3143; Attr:daCompat; Ch1:#$1108; Ch2:#$FFFF), // HANGUL LETTER SSANGPIEUP
  6773. (Unicode:#$3144; Attr:daCompat; Ch1:#$1121; Ch2:#$FFFF), // HANGUL LETTER PIEUP-SIOS
  6774. (Unicode:#$3145; Attr:daCompat; Ch1:#$1109; Ch2:#$FFFF), // HANGUL LETTER SIOS
  6775. (Unicode:#$3146; Attr:daCompat; Ch1:#$110A; Ch2:#$FFFF), // HANGUL LETTER SSANGSIOS
  6776. (Unicode:#$3147; Attr:daCompat; Ch1:#$110B; Ch2:#$FFFF), // HANGUL LETTER IEUNG
  6777. (Unicode:#$3148; Attr:daCompat; Ch1:#$110C; Ch2:#$FFFF), // HANGUL LETTER CIEUC
  6778. (Unicode:#$3149; Attr:daCompat; Ch1:#$110D; Ch2:#$FFFF), // HANGUL LETTER SSANGCIEUC
  6779. (Unicode:#$314A; Attr:daCompat; Ch1:#$110E; Ch2:#$FFFF), // HANGUL LETTER CHIEUCH
  6780. (Unicode:#$314B; Attr:daCompat; Ch1:#$110F; Ch2:#$FFFF), // HANGUL LETTER KHIEUKH
  6781. (Unicode:#$314C; Attr:daCompat; Ch1:#$1110; Ch2:#$FFFF), // HANGUL LETTER THIEUTH
  6782. (Unicode:#$314D; Attr:daCompat; Ch1:#$1111; Ch2:#$FFFF), // HANGUL LETTER PHIEUPH
  6783. (Unicode:#$314E; Attr:daCompat; Ch1:#$1112; Ch2:#$FFFF), // HANGUL LETTER HIEUH
  6784. (Unicode:#$314F; Attr:daCompat; Ch1:#$1161; Ch2:#$FFFF), // HANGUL LETTER A
  6785. (Unicode:#$3150; Attr:daCompat; Ch1:#$1162; Ch2:#$FFFF), // HANGUL LETTER AE
  6786. (Unicode:#$3151; Attr:daCompat; Ch1:#$1163; Ch2:#$FFFF), // HANGUL LETTER YA
  6787. (Unicode:#$3152; Attr:daCompat; Ch1:#$1164; Ch2:#$FFFF), // HANGUL LETTER YAE
  6788. (Unicode:#$3153; Attr:daCompat; Ch1:#$1165; Ch2:#$FFFF), // HANGUL LETTER EO
  6789. (Unicode:#$3154; Attr:daCompat; Ch1:#$1166; Ch2:#$FFFF), // HANGUL LETTER E
  6790. (Unicode:#$3155; Attr:daCompat; Ch1:#$1167; Ch2:#$FFFF), // HANGUL LETTER YEO
  6791. (Unicode:#$3156; Attr:daCompat; Ch1:#$1168; Ch2:#$FFFF), // HANGUL LETTER YE
  6792. (Unicode:#$3157; Attr:daCompat; Ch1:#$1169; Ch2:#$FFFF), // HANGUL LETTER O
  6793. (Unicode:#$3158; Attr:daCompat; Ch1:#$116A; Ch2:#$FFFF), // HANGUL LETTER WA
  6794. (Unicode:#$3159; Attr:daCompat; Ch1:#$116B; Ch2:#$FFFF), // HANGUL LETTER WAE
  6795. (Unicode:#$315A; Attr:daCompat; Ch1:#$116C; Ch2:#$FFFF), // HANGUL LETTER OE
  6796. (Unicode:#$315B; Attr:daCompat; Ch1:#$116D; Ch2:#$FFFF), // HANGUL LETTER YO
  6797. (Unicode:#$315C; Attr:daCompat; Ch1:#$116E; Ch2:#$FFFF), // HANGUL LETTER U
  6798. (Unicode:#$315D; Attr:daCompat; Ch1:#$116F; Ch2:#$FFFF), // HANGUL LETTER WEO
  6799. (Unicode:#$315E; Attr:daCompat; Ch1:#$1170; Ch2:#$FFFF), // HANGUL LETTER WE
  6800. (Unicode:#$315F; Attr:daCompat; Ch1:#$1171; Ch2:#$FFFF), // HANGUL LETTER WI
  6801. (Unicode:#$3160; Attr:daCompat; Ch1:#$1172; Ch2:#$FFFF), // HANGUL LETTER YU
  6802. (Unicode:#$3161; Attr:daCompat; Ch1:#$1173; Ch2:#$FFFF), // HANGUL LETTER EU
  6803. (Unicode:#$3162; Attr:daCompat; Ch1:#$1174; Ch2:#$FFFF), // HANGUL LETTER YI
  6804. (Unicode:#$3163; Attr:daCompat; Ch1:#$1175; Ch2:#$FFFF), // HANGUL LETTER I
  6805. (Unicode:#$3164; Attr:daCompat; Ch1:#$1160; Ch2:#$FFFF), // HANGUL FILLER
  6806. (Unicode:#$3165; Attr:daCompat; Ch1:#$1114; Ch2:#$FFFF), // HANGUL LETTER SSANGNIEUN
  6807. (Unicode:#$3166; Attr:daCompat; Ch1:#$1115; Ch2:#$FFFF), // HANGUL LETTER NIEUN-TIKEUT
  6808. (Unicode:#$3167; Attr:daCompat; Ch1:#$11C7; Ch2:#$FFFF), // HANGUL LETTER NIEUN-SIOS
  6809. (Unicode:#$3168; Attr:daCompat; Ch1:#$11C8; Ch2:#$FFFF), // HANGUL LETTER NIEUN-PANSIOS
  6810. (Unicode:#$3169; Attr:daCompat; Ch1:#$11CC; Ch2:#$FFFF), // HANGUL LETTER RIEUL-KIYEOK-SIOS
  6811. (Unicode:#$316A; Attr:daCompat; Ch1:#$11CE; Ch2:#$FFFF), // HANGUL LETTER RIEUL-TIKEUT
  6812. (Unicode:#$316B; Attr:daCompat; Ch1:#$11D3; Ch2:#$FFFF), // HANGUL LETTER RIEUL-PIEUP-SIOS
  6813. (Unicode:#$316C; Attr:daCompat; Ch1:#$11D7; Ch2:#$FFFF), // HANGUL LETTER RIEUL-PANSIOS
  6814. (Unicode:#$316D; Attr:daCompat; Ch1:#$11D9; Ch2:#$FFFF), // HANGUL LETTER RIEUL-YEORINHIEUH
  6815. (Unicode:#$316E; Attr:daCompat; Ch1:#$111C; Ch2:#$FFFF), // HANGUL LETTER MIEUM-PIEUP
  6816. (Unicode:#$316F; Attr:daCompat; Ch1:#$11DD; Ch2:#$FFFF), // HANGUL LETTER MIEUM-SIOS
  6817. (Unicode:#$3170; Attr:daCompat; Ch1:#$11DF; Ch2:#$FFFF), // HANGUL LETTER MIEUM-PANSIOS
  6818. (Unicode:#$3171; Attr:daCompat; Ch1:#$111D; Ch2:#$FFFF), // HANGUL LETTER KAPYEOUNMIEUM
  6819. (Unicode:#$3172; Attr:daCompat; Ch1:#$111E; Ch2:#$FFFF), // HANGUL LETTER PIEUP-KIYEOK
  6820. (Unicode:#$3173; Attr:daCompat; Ch1:#$1120; Ch2:#$FFFF), // HANGUL LETTER PIEUP-TIKEUT
  6821. (Unicode:#$3174; Attr:daCompat; Ch1:#$1122; Ch2:#$FFFF), // HANGUL LETTER PIEUP-SIOS-KIYEOK
  6822. (Unicode:#$3175; Attr:daCompat; Ch1:#$1123; Ch2:#$FFFF), // HANGUL LETTER PIEUP-SIOS-TIKEUT
  6823. (Unicode:#$3176; Attr:daCompat; Ch1:#$1127; Ch2:#$FFFF), // HANGUL LETTER PIEUP-CIEUC
  6824. (Unicode:#$3177; Attr:daCompat; Ch1:#$1129; Ch2:#$FFFF), // HANGUL LETTER PIEUP-THIEUTH
  6825. (Unicode:#$3178; Attr:daCompat; Ch1:#$112B; Ch2:#$FFFF), // HANGUL LETTER KAPYEOUNPIEUP
  6826. (Unicode:#$3179; Attr:daCompat; Ch1:#$112C; Ch2:#$FFFF), // HANGUL LETTER KAPYEOUNSSANGPIEUP
  6827. (Unicode:#$317A; Attr:daCompat; Ch1:#$112D; Ch2:#$FFFF), // HANGUL LETTER SIOS-KIYEOK
  6828. (Unicode:#$317B; Attr:daCompat; Ch1:#$112E; Ch2:#$FFFF), // HANGUL LETTER SIOS-NIEUN
  6829. (Unicode:#$317C; Attr:daCompat; Ch1:#$112F; Ch2:#$FFFF), // HANGUL LETTER SIOS-TIKEUT
  6830. (Unicode:#$317D; Attr:daCompat; Ch1:#$1132; Ch2:#$FFFF), // HANGUL LETTER SIOS-PIEUP
  6831. (Unicode:#$317E; Attr:daCompat; Ch1:#$1136; Ch2:#$FFFF), // HANGUL LETTER SIOS-CIEUC
  6832. (Unicode:#$317F; Attr:daCompat; Ch1:#$1140; Ch2:#$FFFF), // HANGUL LETTER PANSIOS
  6833. (Unicode:#$3180; Attr:daCompat; Ch1:#$1147; Ch2:#$FFFF), // HANGUL LETTER SSANGIEUNG
  6834. (Unicode:#$3181; Attr:daCompat; Ch1:#$114C; Ch2:#$FFFF), // HANGUL LETTER YESIEUNG
  6835. (Unicode:#$3182; Attr:daCompat; Ch1:#$11F1; Ch2:#$FFFF), // HANGUL LETTER YESIEUNG-SIOS
  6836. (Unicode:#$3183; Attr:daCompat; Ch1:#$11F2; Ch2:#$FFFF), // HANGUL LETTER YESIEUNG-PANSIOS
  6837. (Unicode:#$3184; Attr:daCompat; Ch1:#$1157; Ch2:#$FFFF), // HANGUL LETTER KAPYEOUNPHIEUPH
  6838. (Unicode:#$3185; Attr:daCompat; Ch1:#$1158; Ch2:#$FFFF), // HANGUL LETTER SSANGHIEUH
  6839. (Unicode:#$3186; Attr:daCompat; Ch1:#$1159; Ch2:#$FFFF), // HANGUL LETTER YEORINHIEUH
  6840. (Unicode:#$3187; Attr:daCompat; Ch1:#$1184; Ch2:#$FFFF), // HANGUL LETTER YO-YA
  6841. (Unicode:#$3188; Attr:daCompat; Ch1:#$1185; Ch2:#$FFFF), // HANGUL LETTER YO-YAE
  6842. (Unicode:#$3189; Attr:daCompat; Ch1:#$1188; Ch2:#$FFFF), // HANGUL LETTER YO-I
  6843. (Unicode:#$318A; Attr:daCompat; Ch1:#$1191; Ch2:#$FFFF), // HANGUL LETTER YU-YEO
  6844. (Unicode:#$318B; Attr:daCompat; Ch1:#$1192; Ch2:#$FFFF), // HANGUL LETTER YU-YE
  6845. (Unicode:#$318C; Attr:daCompat; Ch1:#$1194; Ch2:#$FFFF), // HANGUL LETTER YU-I
  6846. (Unicode:#$318D; Attr:daCompat; Ch1:#$119E; Ch2:#$FFFF), // HANGUL LETTER ARAEA
  6847. (Unicode:#$318E; Attr:daCompat; Ch1:#$11A1; Ch2:#$FFFF), // HANGUL LETTER ARAEAE
  6848. (Unicode:#$3192; Attr:daSuper; Ch1:#$4E00; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION ONE MARK
  6849. (Unicode:#$3193; Attr:daSuper; Ch1:#$4E8C; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION TWO MARK
  6850. (Unicode:#$3194; Attr:daSuper; Ch1:#$4E09; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION THREE MARK
  6851. (Unicode:#$3195; Attr:daSuper; Ch1:#$56DB; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION FOUR MARK
  6852. (Unicode:#$3196; Attr:daSuper; Ch1:#$4E0A; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION TOP MARK
  6853. (Unicode:#$3197; Attr:daSuper; Ch1:#$4E2D; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION MIDDLE MARK
  6854. (Unicode:#$3198; Attr:daSuper; Ch1:#$4E0B; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION BOTTOM MARK
  6855. (Unicode:#$3199; Attr:daSuper; Ch1:#$7532; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION FIRST MARK
  6856. (Unicode:#$319A; Attr:daSuper; Ch1:#$4E59; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION SECOND MARK
  6857. (Unicode:#$319B; Attr:daSuper; Ch1:#$4E19; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION THIRD MARK
  6858. (Unicode:#$319C; Attr:daSuper; Ch1:#$4E01; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION FOURTH MARK
  6859. (Unicode:#$319D; Attr:daSuper; Ch1:#$5929; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION HEAVEN MARK
  6860. (Unicode:#$319E; Attr:daSuper; Ch1:#$5730; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION EARTH MARK
  6861. (Unicode:#$319F; Attr:daSuper; Ch1:#$4EBA; Ch2:#$FFFF), // IDEOGRAPHIC ANNOTATION MAN MARK
  6862. (Unicode:#$3200; Attr:daCompat; Ch1:#$0028; Ch2:#$1100; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL KIYEOK
  6863. (Unicode:#$3201; Attr:daCompat; Ch1:#$0028; Ch2:#$1102; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL NIEUN
  6864. (Unicode:#$3202; Attr:daCompat; Ch1:#$0028; Ch2:#$1103; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL TIKEUT
  6865. (Unicode:#$3203; Attr:daCompat; Ch1:#$0028; Ch2:#$1105; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL RIEUL
  6866. (Unicode:#$3204; Attr:daCompat; Ch1:#$0028; Ch2:#$1106; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL MIEUM
  6867. (Unicode:#$3205; Attr:daCompat; Ch1:#$0028; Ch2:#$1107; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL PIEUP
  6868. (Unicode:#$3206; Attr:daCompat; Ch1:#$0028; Ch2:#$1109; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL SIOS
  6869. (Unicode:#$3207; Attr:daCompat; Ch1:#$0028; Ch2:#$110B; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL IEUNG
  6870. (Unicode:#$3208; Attr:daCompat; Ch1:#$0028; Ch2:#$110C; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL CIEUC
  6871. (Unicode:#$3209; Attr:daCompat; Ch1:#$0028; Ch2:#$110E; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL CHIEUCH
  6872. (Unicode:#$320A; Attr:daCompat; Ch1:#$0028; Ch2:#$110F; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL KHIEUKH
  6873. (Unicode:#$320B; Attr:daCompat; Ch1:#$0028; Ch2:#$1110; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL THIEUTH
  6874. (Unicode:#$320C; Attr:daCompat; Ch1:#$0028; Ch2:#$1111; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL PHIEUPH
  6875. (Unicode:#$320D; Attr:daCompat; Ch1:#$0028; Ch2:#$1112; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED HANGUL HIEUH
  6876. (Unicode:#$320E; Attr:daCompat; Ch1:#$0028; Ch2:#$1100; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL KIYEOK A
  6877. (Unicode:#$320F; Attr:daCompat; Ch1:#$0028; Ch2:#$1102; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL NIEUN A
  6878. (Unicode:#$3210; Attr:daCompat; Ch1:#$0028; Ch2:#$1103; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL TIKEUT A
  6879. (Unicode:#$3211; Attr:daCompat; Ch1:#$0028; Ch2:#$1105; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL RIEUL A
  6880. (Unicode:#$3212; Attr:daCompat; Ch1:#$0028; Ch2:#$1106; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL MIEUM A
  6881. (Unicode:#$3213; Attr:daCompat; Ch1:#$0028; Ch2:#$1107; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL PIEUP A
  6882. (Unicode:#$3214; Attr:daCompat; Ch1:#$0028; Ch2:#$1109; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL SIOS A
  6883. (Unicode:#$3215; Attr:daCompat; Ch1:#$0028; Ch2:#$110B; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL IEUNG A
  6884. (Unicode:#$3216; Attr:daCompat; Ch1:#$0028; Ch2:#$110C; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL CIEUC A
  6885. (Unicode:#$3217; Attr:daCompat; Ch1:#$0028; Ch2:#$110E; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL CHIEUCH A
  6886. (Unicode:#$3218; Attr:daCompat; Ch1:#$0028; Ch2:#$110F; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL KHIEUKH A
  6887. (Unicode:#$3219; Attr:daCompat; Ch1:#$0028; Ch2:#$1110; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL THIEUTH A
  6888. (Unicode:#$321A; Attr:daCompat; Ch1:#$0028; Ch2:#$1111; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL PHIEUPH A
  6889. (Unicode:#$321B; Attr:daCompat; Ch1:#$0028; Ch2:#$1112; Ch3:#$1161; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL HIEUH A
  6890. (Unicode:#$321C; Attr:daCompat; Ch1:#$0028; Ch2:#$110C; Ch3:#$116E; Ch4:#$0029; Ch5:#$FFFF), // PARENTHESIZED HANGUL CIEUC U
  6891. (Unicode:#$3220; Attr:daCompat; Ch1:#$0028; Ch2:#$4E00; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH ONE
  6892. (Unicode:#$3221; Attr:daCompat; Ch1:#$0028; Ch2:#$4E8C; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH TWO
  6893. (Unicode:#$3222; Attr:daCompat; Ch1:#$0028; Ch2:#$4E09; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH THREE
  6894. (Unicode:#$3223; Attr:daCompat; Ch1:#$0028; Ch2:#$56DB; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH FOUR
  6895. (Unicode:#$3224; Attr:daCompat; Ch1:#$0028; Ch2:#$4E94; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH FIVE
  6896. (Unicode:#$3225; Attr:daCompat; Ch1:#$0028; Ch2:#$516D; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH SIX
  6897. (Unicode:#$3226; Attr:daCompat; Ch1:#$0028; Ch2:#$4E03; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH SEVEN
  6898. (Unicode:#$3227; Attr:daCompat; Ch1:#$0028; Ch2:#$516B; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH EIGHT
  6899. (Unicode:#$3228; Attr:daCompat; Ch1:#$0028; Ch2:#$4E5D; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH NINE
  6900. (Unicode:#$3229; Attr:daCompat; Ch1:#$0028; Ch2:#$5341; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH TEN
  6901. (Unicode:#$322A; Attr:daCompat; Ch1:#$0028; Ch2:#$6708; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH MOON
  6902. (Unicode:#$322B; Attr:daCompat; Ch1:#$0028; Ch2:#$706B; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH FIRE
  6903. (Unicode:#$322C; Attr:daCompat; Ch1:#$0028; Ch2:#$6C34; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH WATER
  6904. (Unicode:#$322D; Attr:daCompat; Ch1:#$0028; Ch2:#$6728; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH WOOD
  6905. (Unicode:#$322E; Attr:daCompat; Ch1:#$0028; Ch2:#$91D1; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH METAL
  6906. (Unicode:#$322F; Attr:daCompat; Ch1:#$0028; Ch2:#$571F; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH EARTH
  6907. (Unicode:#$3230; Attr:daCompat; Ch1:#$0028; Ch2:#$65E5; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH SUN
  6908. (Unicode:#$3231; Attr:daCompat; Ch1:#$0028; Ch2:#$682A; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH STOCK
  6909. (Unicode:#$3232; Attr:daCompat; Ch1:#$0028; Ch2:#$6709; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH HAVE
  6910. (Unicode:#$3233; Attr:daCompat; Ch1:#$0028; Ch2:#$793E; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH SOCIETY
  6911. (Unicode:#$3234; Attr:daCompat; Ch1:#$0028; Ch2:#$540D; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH NAME
  6912. (Unicode:#$3235; Attr:daCompat; Ch1:#$0028; Ch2:#$7279; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH SPECIAL
  6913. (Unicode:#$3236; Attr:daCompat; Ch1:#$0028; Ch2:#$8CA1; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH FINANCIAL
  6914. (Unicode:#$3237; Attr:daCompat; Ch1:#$0028; Ch2:#$795D; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH CONGRATULATION
  6915. (Unicode:#$3238; Attr:daCompat; Ch1:#$0028; Ch2:#$52B4; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH LABOR
  6916. (Unicode:#$3239; Attr:daCompat; Ch1:#$0028; Ch2:#$4EE3; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH REPRESENT
  6917. (Unicode:#$323A; Attr:daCompat; Ch1:#$0028; Ch2:#$547C; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH CALL
  6918. (Unicode:#$323B; Attr:daCompat; Ch1:#$0028; Ch2:#$5B66; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH STUDY
  6919. (Unicode:#$323C; Attr:daCompat; Ch1:#$0028; Ch2:#$76E3; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH SUPERVISE
  6920. (Unicode:#$323D; Attr:daCompat; Ch1:#$0028; Ch2:#$4F01; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH ENTERPRISE
  6921. (Unicode:#$323E; Attr:daCompat; Ch1:#$0028; Ch2:#$8CC7; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH RESOURCE
  6922. (Unicode:#$323F; Attr:daCompat; Ch1:#$0028; Ch2:#$5354; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH ALLIANCE
  6923. (Unicode:#$3240; Attr:daCompat; Ch1:#$0028; Ch2:#$796D; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH FESTIVAL
  6924. (Unicode:#$3241; Attr:daCompat; Ch1:#$0028; Ch2:#$4F11; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH REST
  6925. (Unicode:#$3242; Attr:daCompat; Ch1:#$0028; Ch2:#$81EA; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH SELF
  6926. (Unicode:#$3243; Attr:daCompat; Ch1:#$0028; Ch2:#$81F3; Ch3:#$0029; Ch4:#$FFFF), // PARENTHESIZED IDEOGRAPH REACH
  6927. (Unicode:#$3260; Attr:daCircle; Ch1:#$1100; Ch2:#$FFFF), // CIRCLED HANGUL KIYEOK
  6928. (Unicode:#$3261; Attr:daCircle; Ch1:#$1102; Ch2:#$FFFF), // CIRCLED HANGUL NIEUN
  6929. (Unicode:#$3262; Attr:daCircle; Ch1:#$1103; Ch2:#$FFFF), // CIRCLED HANGUL TIKEUT
  6930. (Unicode:#$3263; Attr:daCircle; Ch1:#$1105; Ch2:#$FFFF), // CIRCLED HANGUL RIEUL
  6931. (Unicode:#$3264; Attr:daCircle; Ch1:#$1106; Ch2:#$FFFF), // CIRCLED HANGUL MIEUM
  6932. (Unicode:#$3265; Attr:daCircle; Ch1:#$1107; Ch2:#$FFFF), // CIRCLED HANGUL PIEUP
  6933. (Unicode:#$3266; Attr:daCircle; Ch1:#$1109; Ch2:#$FFFF), // CIRCLED HANGUL SIOS
  6934. (Unicode:#$3267; Attr:daCircle; Ch1:#$110B; Ch2:#$FFFF), // CIRCLED HANGUL IEUNG
  6935. (Unicode:#$3268; Attr:daCircle; Ch1:#$110C; Ch2:#$FFFF), // CIRCLED HANGUL CIEUC
  6936. (Unicode:#$3269; Attr:daCircle; Ch1:#$110E; Ch2:#$FFFF), // CIRCLED HANGUL CHIEUCH
  6937. (Unicode:#$326A; Attr:daCircle; Ch1:#$110F; Ch2:#$FFFF), // CIRCLED HANGUL KHIEUKH
  6938. (Unicode:#$326B; Attr:daCircle; Ch1:#$1110; Ch2:#$FFFF), // CIRCLED HANGUL THIEUTH
  6939. (Unicode:#$326C; Attr:daCircle; Ch1:#$1111; Ch2:#$FFFF), // CIRCLED HANGUL PHIEUPH
  6940. (Unicode:#$326D; Attr:daCircle; Ch1:#$1112; Ch2:#$FFFF), // CIRCLED HANGUL HIEUH
  6941. (Unicode:#$326E; Attr:daCircle; Ch1:#$1100; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL KIYEOK A
  6942. (Unicode:#$326F; Attr:daCircle; Ch1:#$1102; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL NIEUN A
  6943. (Unicode:#$3270; Attr:daCircle; Ch1:#$1103; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL TIKEUT A
  6944. (Unicode:#$3271; Attr:daCircle; Ch1:#$1105; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL RIEUL A
  6945. (Unicode:#$3272; Attr:daCircle; Ch1:#$1106; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL MIEUM A
  6946. (Unicode:#$3273; Attr:daCircle; Ch1:#$1107; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL PIEUP A
  6947. (Unicode:#$3274; Attr:daCircle; Ch1:#$1109; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL SIOS A
  6948. (Unicode:#$3275; Attr:daCircle; Ch1:#$110B; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL IEUNG A
  6949. (Unicode:#$3276; Attr:daCircle; Ch1:#$110C; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL CIEUC A
  6950. (Unicode:#$3277; Attr:daCircle; Ch1:#$110E; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL CHIEUCH A
  6951. (Unicode:#$3278; Attr:daCircle; Ch1:#$110F; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL KHIEUKH A
  6952. (Unicode:#$3279; Attr:daCircle; Ch1:#$1110; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL THIEUTH A
  6953. (Unicode:#$327A; Attr:daCircle; Ch1:#$1111; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL PHIEUPH A
  6954. (Unicode:#$327B; Attr:daCircle; Ch1:#$1112; Ch2:#$1161; Ch3:#$FFFF), // CIRCLED HANGUL HIEUH A
  6955. (Unicode:#$3280; Attr:daCircle; Ch1:#$4E00; Ch2:#$FFFF), // CIRCLED IDEOGRAPH ONE
  6956. (Unicode:#$3281; Attr:daCircle; Ch1:#$4E8C; Ch2:#$FFFF), // CIRCLED IDEOGRAPH TWO
  6957. (Unicode:#$3282; Attr:daCircle; Ch1:#$4E09; Ch2:#$FFFF), // CIRCLED IDEOGRAPH THREE
  6958. (Unicode:#$3283; Attr:daCircle; Ch1:#$56DB; Ch2:#$FFFF), // CIRCLED IDEOGRAPH FOUR
  6959. (Unicode:#$3284; Attr:daCircle; Ch1:#$4E94; Ch2:#$FFFF), // CIRCLED IDEOGRAPH FIVE
  6960. (Unicode:#$3285; Attr:daCircle; Ch1:#$516D; Ch2:#$FFFF), // CIRCLED IDEOGRAPH SIX
  6961. (Unicode:#$3286; Attr:daCircle; Ch1:#$4E03; Ch2:#$FFFF), // CIRCLED IDEOGRAPH SEVEN
  6962. (Unicode:#$3287; Attr:daCircle; Ch1:#$516B; Ch2:#$FFFF), // CIRCLED IDEOGRAPH EIGHT
  6963. (Unicode:#$3288; Attr:daCircle; Ch1:#$4E5D; Ch2:#$FFFF), // CIRCLED IDEOGRAPH NINE
  6964. (Unicode:#$3289; Attr:daCircle; Ch1:#$5341; Ch2:#$FFFF), // CIRCLED IDEOGRAPH TEN
  6965. (Unicode:#$328A; Attr:daCircle; Ch1:#$6708; Ch2:#$FFFF), // CIRCLED IDEOGRAPH MOON
  6966. (Unicode:#$328B; Attr:daCircle; Ch1:#$706B; Ch2:#$FFFF), // CIRCLED IDEOGRAPH FIRE
  6967. (Unicode:#$328C; Attr:daCircle; Ch1:#$6C34; Ch2:#$FFFF), // CIRCLED IDEOGRAPH WATER
  6968. (Unicode:#$328D; Attr:daCircle; Ch1:#$6728; Ch2:#$FFFF), // CIRCLED IDEOGRAPH WOOD
  6969. (Unicode:#$328E; Attr:daCircle; Ch1:#$91D1; Ch2:#$FFFF), // CIRCLED IDEOGRAPH METAL
  6970. (Unicode:#$328F; Attr:daCircle; Ch1:#$571F; Ch2:#$FFFF), // CIRCLED IDEOGRAPH EARTH
  6971. (Unicode:#$3290; Attr:daCircle; Ch1:#$65E5; Ch2:#$FFFF), // CIRCLED IDEOGRAPH SUN
  6972. (Unicode:#$3291; Attr:daCircle; Ch1:#$682A; Ch2:#$FFFF), // CIRCLED IDEOGRAPH STOCK
  6973. (Unicode:#$3292; Attr:daCircle; Ch1:#$6709; Ch2:#$FFFF), // CIRCLED IDEOGRAPH HAVE
  6974. (Unicode:#$3293; Attr:daCircle; Ch1:#$793E; Ch2:#$FFFF), // CIRCLED IDEOGRAPH SOCIETY
  6975. (Unicode:#$3294; Attr:daCircle; Ch1:#$540D; Ch2:#$FFFF), // CIRCLED IDEOGRAPH NAME
  6976. (Unicode:#$3295; Attr:daCircle; Ch1:#$7279; Ch2:#$FFFF), // CIRCLED IDEOGRAPH SPECIAL
  6977. (Unicode:#$3296; Attr:daCircle; Ch1:#$8CA1; Ch2:#$FFFF), // CIRCLED IDEOGRAPH FINANCIAL
  6978. (Unicode:#$3297; Attr:daCircle; Ch1:#$795D; Ch2:#$FFFF), // CIRCLED IDEOGRAPH CONGRATULATION
  6979. (Unicode:#$3298; Attr:daCircle; Ch1:#$52B4; Ch2:#$FFFF), // CIRCLED IDEOGRAPH LABOR
  6980. (Unicode:#$3299; Attr:daCircle; Ch1:#$79D8; Ch2:#$FFFF), // CIRCLED IDEOGRAPH SECRET
  6981. (Unicode:#$329A; Attr:daCircle; Ch1:#$7537; Ch2:#$FFFF), // CIRCLED IDEOGRAPH MALE
  6982. (Unicode:#$329B; Attr:daCircle; Ch1:#$5973; Ch2:#$FFFF), // CIRCLED IDEOGRAPH FEMALE
  6983. (Unicode:#$329C; Attr:daCircle; Ch1:#$9069; Ch2:#$FFFF), // CIRCLED IDEOGRAPH SUITABLE
  6984. (Unicode:#$329D; Attr:daCircle; Ch1:#$512A; Ch2:#$FFFF), // CIRCLED IDEOGRAPH EXCELLENT
  6985. (Unicode:#$329E; Attr:daCircle; Ch1:#$5370; Ch2:#$FFFF), // CIRCLED IDEOGRAPH PRINT
  6986. (Unicode:#$329F; Attr:daCircle; Ch1:#$6CE8; Ch2:#$FFFF), // CIRCLED IDEOGRAPH ATTENTION
  6987. (Unicode:#$32A0; Attr:daCircle; Ch1:#$9805; Ch2:#$FFFF), // CIRCLED IDEOGRAPH ITEM
  6988. (Unicode:#$32A1; Attr:daCircle; Ch1:#$4F11; Ch2:#$FFFF), // CIRCLED IDEOGRAPH REST
  6989. (Unicode:#$32A2; Attr:daCircle; Ch1:#$5199; Ch2:#$FFFF), // CIRCLED IDEOGRAPH COPY
  6990. (Unicode:#$32A3; Attr:daCircle; Ch1:#$6B63; Ch2:#$FFFF), // CIRCLED IDEOGRAPH CORRECT
  6991. (Unicode:#$32A4; Attr:daCircle; Ch1:#$4E0A; Ch2:#$FFFF), // CIRCLED IDEOGRAPH HIGH
  6992. (Unicode:#$32A5; Attr:daCircle; Ch1:#$4E2D; Ch2:#$FFFF), // CIRCLED IDEOGRAPH CENTRE
  6993. (Unicode:#$32A6; Attr:daCircle; Ch1:#$4E0B; Ch2:#$FFFF), // CIRCLED IDEOGRAPH LOW
  6994. (Unicode:#$32A7; Attr:daCircle; Ch1:#$5DE6; Ch2:#$FFFF), // CIRCLED IDEOGRAPH LEFT
  6995. (Unicode:#$32A8; Attr:daCircle; Ch1:#$53F3; Ch2:#$FFFF), // CIRCLED IDEOGRAPH RIGHT
  6996. (Unicode:#$32A9; Attr:daCircle; Ch1:#$533B; Ch2:#$FFFF), // CIRCLED IDEOGRAPH MEDICINE
  6997. (Unicode:#$32AA; Attr:daCircle; Ch1:#$5B97; Ch2:#$FFFF), // CIRCLED IDEOGRAPH RELIGION
  6998. (Unicode:#$32AB; Attr:daCircle; Ch1:#$5B66; Ch2:#$FFFF), // CIRCLED IDEOGRAPH STUDY
  6999. (Unicode:#$32AC; Attr:daCircle; Ch1:#$76E3; Ch2:#$FFFF), // CIRCLED IDEOGRAPH SUPERVISE
  7000. (Unicode:#$32AD; Attr:daCircle; Ch1:#$4F01; Ch2:#$FFFF), // CIRCLED IDEOGRAPH ENTERPRISE
  7001. (Unicode:#$32AE; Attr:daCircle; Ch1:#$8CC7; Ch2:#$FFFF), // CIRCLED IDEOGRAPH RESOURCE
  7002. (Unicode:#$32AF; Attr:daCircle; Ch1:#$5354; Ch2:#$FFFF), // CIRCLED IDEOGRAPH ALLIANCE
  7003. (Unicode:#$32B0; Attr:daCircle; Ch1:#$591C; Ch2:#$FFFF), // CIRCLED IDEOGRAPH NIGHT
  7004. (Unicode:#$32C0; Attr:daCompat; Ch1:#$0031; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY
  7005. (Unicode:#$32C1; Attr:daCompat; Ch1:#$0032; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY
  7006. (Unicode:#$32C2; Attr:daCompat; Ch1:#$0033; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH
  7007. (Unicode:#$32C3; Attr:daCompat; Ch1:#$0034; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL
  7008. (Unicode:#$32C4; Attr:daCompat; Ch1:#$0035; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY
  7009. (Unicode:#$32C5; Attr:daCompat; Ch1:#$0036; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE
  7010. (Unicode:#$32C6; Attr:daCompat; Ch1:#$0037; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY
  7011. (Unicode:#$32C7; Attr:daCompat; Ch1:#$0038; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST
  7012. (Unicode:#$32C8; Attr:daCompat; Ch1:#$0039; Ch2:#$6708; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER
  7013. (Unicode:#$32C9; Attr:daCompat; Ch1:#$0031; Ch2:#$0030; Ch3:#$6708; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER
  7014. (Unicode:#$32CA; Attr:daCompat; Ch1:#$0031; Ch2:#$0031; Ch3:#$6708; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER
  7015. (Unicode:#$32CB; Attr:daCompat; Ch1:#$0031; Ch2:#$0032; Ch3:#$6708; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
  7016. (Unicode:#$32D0; Attr:daCircle; Ch1:#$30A2; Ch2:#$FFFF), // CIRCLED KATAKANA A
  7017. (Unicode:#$32D1; Attr:daCircle; Ch1:#$30A4; Ch2:#$FFFF), // CIRCLED KATAKANA I
  7018. (Unicode:#$32D2; Attr:daCircle; Ch1:#$30A6; Ch2:#$FFFF), // CIRCLED KATAKANA U
  7019. (Unicode:#$32D3; Attr:daCircle; Ch1:#$30A8; Ch2:#$FFFF), // CIRCLED KATAKANA E
  7020. (Unicode:#$32D4; Attr:daCircle; Ch1:#$30AA; Ch2:#$FFFF), // CIRCLED KATAKANA O
  7021. (Unicode:#$32D5; Attr:daCircle; Ch1:#$30AB; Ch2:#$FFFF), // CIRCLED KATAKANA KA
  7022. (Unicode:#$32D6; Attr:daCircle; Ch1:#$30AD; Ch2:#$FFFF), // CIRCLED KATAKANA KI
  7023. (Unicode:#$32D7; Attr:daCircle; Ch1:#$30AF; Ch2:#$FFFF), // CIRCLED KATAKANA KU
  7024. (Unicode:#$32D8; Attr:daCircle; Ch1:#$30B1; Ch2:#$FFFF), // CIRCLED KATAKANA KE
  7025. (Unicode:#$32D9; Attr:daCircle; Ch1:#$30B3; Ch2:#$FFFF), // CIRCLED KATAKANA KO
  7026. (Unicode:#$32DA; Attr:daCircle; Ch1:#$30B5; Ch2:#$FFFF), // CIRCLED KATAKANA SA
  7027. (Unicode:#$32DB; Attr:daCircle; Ch1:#$30B7; Ch2:#$FFFF), // CIRCLED KATAKANA SI
  7028. (Unicode:#$32DC; Attr:daCircle; Ch1:#$30B9; Ch2:#$FFFF), // CIRCLED KATAKANA SU
  7029. (Unicode:#$32DD; Attr:daCircle; Ch1:#$30BB; Ch2:#$FFFF), // CIRCLED KATAKANA SE
  7030. (Unicode:#$32DE; Attr:daCircle; Ch1:#$30BD; Ch2:#$FFFF), // CIRCLED KATAKANA SO
  7031. (Unicode:#$32DF; Attr:daCircle; Ch1:#$30BF; Ch2:#$FFFF), // CIRCLED KATAKANA TA
  7032. (Unicode:#$32E0; Attr:daCircle; Ch1:#$30C1; Ch2:#$FFFF), // CIRCLED KATAKANA TI
  7033. (Unicode:#$32E1; Attr:daCircle; Ch1:#$30C4; Ch2:#$FFFF), // CIRCLED KATAKANA TU
  7034. (Unicode:#$32E2; Attr:daCircle; Ch1:#$30C6; Ch2:#$FFFF), // CIRCLED KATAKANA TE
  7035. (Unicode:#$32E3; Attr:daCircle; Ch1:#$30C8; Ch2:#$FFFF), // CIRCLED KATAKANA TO
  7036. (Unicode:#$32E4; Attr:daCircle; Ch1:#$30CA; Ch2:#$FFFF), // CIRCLED KATAKANA NA
  7037. (Unicode:#$32E5; Attr:daCircle; Ch1:#$30CB; Ch2:#$FFFF), // CIRCLED KATAKANA NI
  7038. (Unicode:#$32E6; Attr:daCircle; Ch1:#$30CC; Ch2:#$FFFF), // CIRCLED KATAKANA NU
  7039. (Unicode:#$32E7; Attr:daCircle; Ch1:#$30CD; Ch2:#$FFFF), // CIRCLED KATAKANA NE
  7040. (Unicode:#$32E8; Attr:daCircle; Ch1:#$30CE; Ch2:#$FFFF), // CIRCLED KATAKANA NO
  7041. (Unicode:#$32E9; Attr:daCircle; Ch1:#$30CF; Ch2:#$FFFF), // CIRCLED KATAKANA HA
  7042. (Unicode:#$32EA; Attr:daCircle; Ch1:#$30D2; Ch2:#$FFFF), // CIRCLED KATAKANA HI
  7043. (Unicode:#$32EB; Attr:daCircle; Ch1:#$30D5; Ch2:#$FFFF), // CIRCLED KATAKANA HU
  7044. (Unicode:#$32EC; Attr:daCircle; Ch1:#$30D8; Ch2:#$FFFF), // CIRCLED KATAKANA HE
  7045. (Unicode:#$32ED; Attr:daCircle; Ch1:#$30DB; Ch2:#$FFFF), // CIRCLED KATAKANA HO
  7046. (Unicode:#$32EE; Attr:daCircle; Ch1:#$30DE; Ch2:#$FFFF), // CIRCLED KATAKANA MA
  7047. (Unicode:#$32EF; Attr:daCircle; Ch1:#$30DF; Ch2:#$FFFF), // CIRCLED KATAKANA MI
  7048. (Unicode:#$32F0; Attr:daCircle; Ch1:#$30E0; Ch2:#$FFFF), // CIRCLED KATAKANA MU
  7049. (Unicode:#$32F1; Attr:daCircle; Ch1:#$30E1; Ch2:#$FFFF), // CIRCLED KATAKANA ME
  7050. (Unicode:#$32F2; Attr:daCircle; Ch1:#$30E2; Ch2:#$FFFF), // CIRCLED KATAKANA MO
  7051. (Unicode:#$32F3; Attr:daCircle; Ch1:#$30E4; Ch2:#$FFFF), // CIRCLED KATAKANA YA
  7052. (Unicode:#$32F4; Attr:daCircle; Ch1:#$30E6; Ch2:#$FFFF), // CIRCLED KATAKANA YU
  7053. (Unicode:#$32F5; Attr:daCircle; Ch1:#$30E8; Ch2:#$FFFF), // CIRCLED KATAKANA YO
  7054. (Unicode:#$32F6; Attr:daCircle; Ch1:#$30E9; Ch2:#$FFFF), // CIRCLED KATAKANA RA
  7055. (Unicode:#$32F7; Attr:daCircle; Ch1:#$30EA; Ch2:#$FFFF), // CIRCLED KATAKANA RI
  7056. (Unicode:#$32F8; Attr:daCircle; Ch1:#$30EB; Ch2:#$FFFF), // CIRCLED KATAKANA RU
  7057. (Unicode:#$32F9; Attr:daCircle; Ch1:#$30EC; Ch2:#$FFFF), // CIRCLED KATAKANA RE
  7058. (Unicode:#$32FA; Attr:daCircle; Ch1:#$30ED; Ch2:#$FFFF), // CIRCLED KATAKANA RO
  7059. (Unicode:#$32FB; Attr:daCircle; Ch1:#$30EF; Ch2:#$FFFF), // CIRCLED KATAKANA WA
  7060. (Unicode:#$32FC; Attr:daCircle; Ch1:#$30F0; Ch2:#$FFFF), // CIRCLED KATAKANA WI
  7061. (Unicode:#$32FD; Attr:daCircle; Ch1:#$30F1; Ch2:#$FFFF), // CIRCLED KATAKANA WE
  7062. (Unicode:#$32FE; Attr:daCircle; Ch1:#$30F2; Ch2:#$FFFF), // CIRCLED KATAKANA WO
  7063. (Unicode:#$3300; Attr:daSquare; Ch1:#$30A2; Ch2:#$30D1; Ch3:#$30FC; Ch4:#$30C8; Ch5:#$FFFF), // SQUARE APAATO
  7064. (Unicode:#$3301; Attr:daSquare; Ch1:#$30A2; Ch2:#$30EB; Ch3:#$30D5; Ch4:#$30A1; Ch5:#$FFFF), // SQUARE ARUHUA
  7065. (Unicode:#$3302; Attr:daSquare; Ch1:#$30A2; Ch2:#$30F3; Ch3:#$30DA; Ch4:#$30A2; Ch5:#$FFFF), // SQUARE ANPEA
  7066. (Unicode:#$3303; Attr:daSquare; Ch1:#$30A2; Ch2:#$30FC; Ch3:#$30EB; Ch4:#$FFFF), // SQUARE AARU
  7067. (Unicode:#$3304; Attr:daSquare; Ch1:#$30A4; Ch2:#$30CB; Ch3:#$30F3; Ch4:#$30B0; Ch5:#$FFFF), // SQUARE ININGU
  7068. (Unicode:#$3305; Attr:daSquare; Ch1:#$30A4; Ch2:#$30F3; Ch3:#$30C1; Ch4:#$FFFF), // SQUARE INTI
  7069. (Unicode:#$3306; Attr:daSquare; Ch1:#$30A6; Ch2:#$30A9; Ch3:#$30F3; Ch4:#$FFFF), // SQUARE UON
  7070. (Unicode:#$3307; Attr:daSquare; Ch1:#$30A8; Ch2:#$30B9; Ch3:#$30AF; Ch4:#$30FC; Ch5:#$30C9), // SQUARE ESUKUUDO
  7071. (Unicode:#$3308; Attr:daSquare; Ch1:#$30A8; Ch2:#$30FC; Ch3:#$30AB; Ch4:#$30FC; Ch5:#$FFFF), // SQUARE EEKAA
  7072. (Unicode:#$3309; Attr:daSquare; Ch1:#$30AA; Ch2:#$30F3; Ch3:#$30B9; Ch4:#$FFFF), // SQUARE ONSU
  7073. (Unicode:#$330A; Attr:daSquare; Ch1:#$30AA; Ch2:#$30FC; Ch3:#$30E0; Ch4:#$FFFF), // SQUARE OOMU
  7074. (Unicode:#$330B; Attr:daSquare; Ch1:#$30AB; Ch2:#$30A4; Ch3:#$30EA; Ch4:#$FFFF), // SQUARE KAIRI
  7075. (Unicode:#$330C; Attr:daSquare; Ch1:#$30AB; Ch2:#$30E9; Ch3:#$30C3; Ch4:#$30C8; Ch5:#$FFFF), // SQUARE KARATTO
  7076. (Unicode:#$330D; Attr:daSquare; Ch1:#$30AB; Ch2:#$30ED; Ch3:#$30EA; Ch4:#$30FC; Ch5:#$FFFF), // SQUARE KARORII
  7077. (Unicode:#$330E; Attr:daSquare; Ch1:#$30AC; Ch2:#$30ED; Ch3:#$30F3; Ch4:#$FFFF), // SQUARE GARON
  7078. (Unicode:#$330F; Attr:daSquare; Ch1:#$30AC; Ch2:#$30F3; Ch3:#$30DE; Ch4:#$FFFF), // SQUARE GANMA
  7079. (Unicode:#$3310; Attr:daSquare; Ch1:#$30AE; Ch2:#$30AC; Ch3:#$FFFF), // SQUARE GIGA
  7080. (Unicode:#$3311; Attr:daSquare; Ch1:#$30AE; Ch2:#$30CB; Ch3:#$30FC; Ch4:#$FFFF), // SQUARE GINII
  7081. (Unicode:#$3312; Attr:daSquare; Ch1:#$30AD; Ch2:#$30E5; Ch3:#$30EA; Ch4:#$30FC; Ch5:#$FFFF), // SQUARE KYURII
  7082. (Unicode:#$3313; Attr:daSquare; Ch1:#$30AE; Ch2:#$30EB; Ch3:#$30C0; Ch4:#$30FC; Ch5:#$FFFF), // SQUARE GIRUDAA
  7083. (Unicode:#$3314; Attr:daSquare; Ch1:#$30AD; Ch2:#$30ED; Ch3:#$FFFF), // SQUARE KIRO
  7084. (Unicode:#$3315; Attr:daSquare; Ch1:#$30AD; Ch2:#$30ED; Ch3:#$30B0; Ch4:#$30E9; Ch5:#$30E0), // SQUARE KIROGURAMU
  7085. (Unicode:#$3317; Attr:daSquare; Ch1:#$30AD; Ch2:#$30ED; Ch3:#$30EF; Ch4:#$30C3; Ch5:#$30C8), // SQUARE KIROWATTO
  7086. (Unicode:#$3318; Attr:daSquare; Ch1:#$30B0; Ch2:#$30E9; Ch3:#$30E0; Ch4:#$FFFF), // SQUARE GURAMU
  7087. (Unicode:#$3319; Attr:daSquare; Ch1:#$30B0; Ch2:#$30E9; Ch3:#$30E0; Ch4:#$30C8; Ch5:#$30F3), // SQUARE GURAMUTON
  7088. (Unicode:#$331A; Attr:daSquare; Ch1:#$30AF; Ch2:#$30EB; Ch3:#$30BC; Ch4:#$30A4; Ch5:#$30ED), // SQUARE KURUZEIRO
  7089. (Unicode:#$331B; Attr:daSquare; Ch1:#$30AF; Ch2:#$30ED; Ch3:#$30FC; Ch4:#$30CD; Ch5:#$FFFF), // SQUARE KUROONE
  7090. (Unicode:#$331C; Attr:daSquare; Ch1:#$30B1; Ch2:#$30FC; Ch3:#$30B9; Ch4:#$FFFF), // SQUARE KEESU
  7091. (Unicode:#$331D; Attr:daSquare; Ch1:#$30B3; Ch2:#$30EB; Ch3:#$30CA; Ch4:#$FFFF), // SQUARE KORUNA
  7092. (Unicode:#$331E; Attr:daSquare; Ch1:#$30B3; Ch2:#$30FC; Ch3:#$30DD; Ch4:#$FFFF), // SQUARE KOOPO
  7093. (Unicode:#$331F; Attr:daSquare; Ch1:#$30B5; Ch2:#$30A4; Ch3:#$30AF; Ch4:#$30EB; Ch5:#$FFFF), // SQUARE SAIKURU
  7094. (Unicode:#$3320; Attr:daSquare; Ch1:#$30B5; Ch2:#$30F3; Ch3:#$30C1; Ch4:#$30FC; Ch5:#$30E0), // SQUARE SANTIIMU
  7095. (Unicode:#$3321; Attr:daSquare; Ch1:#$30B7; Ch2:#$30EA; Ch3:#$30F3; Ch4:#$30B0; Ch5:#$FFFF), // SQUARE SIRINGU
  7096. (Unicode:#$3322; Attr:daSquare; Ch1:#$30BB; Ch2:#$30F3; Ch3:#$30C1; Ch4:#$FFFF), // SQUARE SENTI
  7097. (Unicode:#$3323; Attr:daSquare; Ch1:#$30BB; Ch2:#$30F3; Ch3:#$30C8; Ch4:#$FFFF), // SQUARE SENTO
  7098. (Unicode:#$3324; Attr:daSquare; Ch1:#$30C0; Ch2:#$30FC; Ch3:#$30B9; Ch4:#$FFFF), // SQUARE DAASU
  7099. (Unicode:#$3325; Attr:daSquare; Ch1:#$30C7; Ch2:#$30B7; Ch3:#$FFFF), // SQUARE DESI
  7100. (Unicode:#$3326; Attr:daSquare; Ch1:#$30C9; Ch2:#$30EB; Ch3:#$FFFF), // SQUARE DORU
  7101. (Unicode:#$3327; Attr:daSquare; Ch1:#$30C8; Ch2:#$30F3; Ch3:#$FFFF), // SQUARE TON
  7102. (Unicode:#$3328; Attr:daSquare; Ch1:#$30CA; Ch2:#$30CE; Ch3:#$FFFF), // SQUARE NANO
  7103. (Unicode:#$3329; Attr:daSquare; Ch1:#$30CE; Ch2:#$30C3; Ch3:#$30C8; Ch4:#$FFFF), // SQUARE NOTTO
  7104. (Unicode:#$332A; Attr:daSquare; Ch1:#$30CF; Ch2:#$30A4; Ch3:#$30C4; Ch4:#$FFFF), // SQUARE HAITU
  7105. (Unicode:#$332B; Attr:daSquare; Ch1:#$30D1; Ch2:#$30FC; Ch3:#$30BB; Ch4:#$30F3; Ch5:#$30C8), // SQUARE PAASENTO
  7106. (Unicode:#$332C; Attr:daSquare; Ch1:#$30D1; Ch2:#$30FC; Ch3:#$30C4; Ch4:#$FFFF), // SQUARE PAATU
  7107. (Unicode:#$332D; Attr:daSquare; Ch1:#$30D0; Ch2:#$30FC; Ch3:#$30EC; Ch4:#$30EB; Ch5:#$FFFF), // SQUARE BAARERU
  7108. (Unicode:#$332E; Attr:daSquare; Ch1:#$30D4; Ch2:#$30A2; Ch3:#$30B9; Ch4:#$30C8; Ch5:#$30EB), // SQUARE PIASUTORU
  7109. (Unicode:#$332F; Attr:daSquare; Ch1:#$30D4; Ch2:#$30AF; Ch3:#$30EB; Ch4:#$FFFF), // SQUARE PIKURU
  7110. (Unicode:#$3330; Attr:daSquare; Ch1:#$30D4; Ch2:#$30B3; Ch3:#$FFFF), // SQUARE PIKO
  7111. (Unicode:#$3331; Attr:daSquare; Ch1:#$30D3; Ch2:#$30EB; Ch3:#$FFFF), // SQUARE BIRU
  7112. (Unicode:#$3332; Attr:daSquare; Ch1:#$30D5; Ch2:#$30A1; Ch3:#$30E9; Ch4:#$30C3; Ch5:#$30C9), // SQUARE HUARADDO
  7113. (Unicode:#$3333; Attr:daSquare; Ch1:#$30D5; Ch2:#$30A3; Ch3:#$30FC; Ch4:#$30C8; Ch5:#$FFFF), // SQUARE HUIITO
  7114. (Unicode:#$3334; Attr:daSquare; Ch1:#$30D6; Ch2:#$30C3; Ch3:#$30B7; Ch4:#$30A7; Ch5:#$30EB), // SQUARE BUSSYERU
  7115. (Unicode:#$3335; Attr:daSquare; Ch1:#$30D5; Ch2:#$30E9; Ch3:#$30F3; Ch4:#$FFFF), // SQUARE HURAN
  7116. (Unicode:#$3336; Attr:daSquare; Ch1:#$30D8; Ch2:#$30AF; Ch3:#$30BF; Ch4:#$30FC; Ch5:#$30EB), // SQUARE HEKUTAARU
  7117. (Unicode:#$3337; Attr:daSquare; Ch1:#$30DA; Ch2:#$30BD; Ch3:#$FFFF), // SQUARE PESO
  7118. (Unicode:#$3338; Attr:daSquare; Ch1:#$30DA; Ch2:#$30CB; Ch3:#$30D2; Ch4:#$FFFF), // SQUARE PENIHI
  7119. (Unicode:#$3339; Attr:daSquare; Ch1:#$30D8; Ch2:#$30EB; Ch3:#$30C4; Ch4:#$FFFF), // SQUARE HERUTU
  7120. (Unicode:#$333A; Attr:daSquare; Ch1:#$30DA; Ch2:#$30F3; Ch3:#$30B9; Ch4:#$FFFF), // SQUARE PENSU
  7121. (Unicode:#$333B; Attr:daSquare; Ch1:#$30DA; Ch2:#$30FC; Ch3:#$30B8; Ch4:#$FFFF), // SQUARE PEEZI
  7122. (Unicode:#$333C; Attr:daSquare; Ch1:#$30D9; Ch2:#$30FC; Ch3:#$30BF; Ch4:#$FFFF), // SQUARE BEETA
  7123. (Unicode:#$333D; Attr:daSquare; Ch1:#$30DD; Ch2:#$30A4; Ch3:#$30F3; Ch4:#$30C8; Ch5:#$FFFF), // SQUARE POINTO
  7124. (Unicode:#$333E; Attr:daSquare; Ch1:#$30DC; Ch2:#$30EB; Ch3:#$30C8; Ch4:#$FFFF), // SQUARE BORUTO
  7125. (Unicode:#$333F; Attr:daSquare; Ch1:#$30DB; Ch2:#$30F3; Ch3:#$FFFF), // SQUARE HON
  7126. (Unicode:#$3340; Attr:daSquare; Ch1:#$30DD; Ch2:#$30F3; Ch3:#$30C9; Ch4:#$FFFF), // SQUARE PONDO
  7127. (Unicode:#$3341; Attr:daSquare; Ch1:#$30DB; Ch2:#$30FC; Ch3:#$30EB; Ch4:#$FFFF), // SQUARE HOORU
  7128. (Unicode:#$3342; Attr:daSquare; Ch1:#$30DB; Ch2:#$30FC; Ch3:#$30F3; Ch4:#$FFFF), // SQUARE HOON
  7129. (Unicode:#$3343; Attr:daSquare; Ch1:#$30DE; Ch2:#$30A4; Ch3:#$30AF; Ch4:#$30ED; Ch5:#$FFFF), // SQUARE MAIKURO
  7130. (Unicode:#$3344; Attr:daSquare; Ch1:#$30DE; Ch2:#$30A4; Ch3:#$30EB; Ch4:#$FFFF), // SQUARE MAIRU
  7131. (Unicode:#$3345; Attr:daSquare; Ch1:#$30DE; Ch2:#$30C3; Ch3:#$30CF; Ch4:#$FFFF), // SQUARE MAHHA
  7132. (Unicode:#$3346; Attr:daSquare; Ch1:#$30DE; Ch2:#$30EB; Ch3:#$30AF; Ch4:#$FFFF), // SQUARE MARUKU
  7133. (Unicode:#$3347; Attr:daSquare; Ch1:#$30DE; Ch2:#$30F3; Ch3:#$30B7; Ch4:#$30E7; Ch5:#$30F3), // SQUARE MANSYON
  7134. (Unicode:#$3348; Attr:daSquare; Ch1:#$30DF; Ch2:#$30AF; Ch3:#$30ED; Ch4:#$30F3; Ch5:#$FFFF), // SQUARE MIKURON
  7135. (Unicode:#$3349; Attr:daSquare; Ch1:#$30DF; Ch2:#$30EA; Ch3:#$FFFF), // SQUARE MIRI
  7136. (Unicode:#$334A; Attr:daSquare; Ch1:#$30DF; Ch2:#$30EA; Ch3:#$30D0; Ch4:#$30FC; Ch5:#$30EB), // SQUARE MIRIBAARU
  7137. (Unicode:#$334B; Attr:daSquare; Ch1:#$30E1; Ch2:#$30AC; Ch3:#$FFFF), // SQUARE MEGA
  7138. (Unicode:#$334C; Attr:daSquare; Ch1:#$30E1; Ch2:#$30AC; Ch3:#$30C8; Ch4:#$30F3; Ch5:#$FFFF), // SQUARE MEGATON
  7139. (Unicode:#$334D; Attr:daSquare; Ch1:#$30E1; Ch2:#$30FC; Ch3:#$30C8; Ch4:#$30EB; Ch5:#$FFFF), // SQUARE MEETORU
  7140. (Unicode:#$334E; Attr:daSquare; Ch1:#$30E4; Ch2:#$30FC; Ch3:#$30C9; Ch4:#$FFFF), // SQUARE YAADO
  7141. (Unicode:#$334F; Attr:daSquare; Ch1:#$30E4; Ch2:#$30FC; Ch3:#$30EB; Ch4:#$FFFF), // SQUARE YAARU
  7142. (Unicode:#$3350; Attr:daSquare; Ch1:#$30E6; Ch2:#$30A2; Ch3:#$30F3; Ch4:#$FFFF), // SQUARE YUAN
  7143. (Unicode:#$3351; Attr:daSquare; Ch1:#$30EA; Ch2:#$30C3; Ch3:#$30C8; Ch4:#$30EB; Ch5:#$FFFF), // SQUARE RITTORU
  7144. (Unicode:#$3352; Attr:daSquare; Ch1:#$30EA; Ch2:#$30E9; Ch3:#$FFFF), // SQUARE RIRA
  7145. (Unicode:#$3353; Attr:daSquare; Ch1:#$30EB; Ch2:#$30D4; Ch3:#$30FC; Ch4:#$FFFF), // SQUARE RUPII
  7146. (Unicode:#$3354; Attr:daSquare; Ch1:#$30EB; Ch2:#$30FC; Ch3:#$30D6; Ch4:#$30EB; Ch5:#$FFFF), // SQUARE RUUBURU
  7147. (Unicode:#$3355; Attr:daSquare; Ch1:#$30EC; Ch2:#$30E0; Ch3:#$FFFF), // SQUARE REMU
  7148. (Unicode:#$3356; Attr:daSquare; Ch1:#$30EC; Ch2:#$30F3; Ch3:#$30C8; Ch4:#$30B2; Ch5:#$30F3), // SQUARE RENTOGEN
  7149. (Unicode:#$3357; Attr:daSquare; Ch1:#$30EF; Ch2:#$30C3; Ch3:#$30C8; Ch4:#$FFFF), // SQUARE WATTO
  7150. (Unicode:#$3358; Attr:daCompat; Ch1:#$0030; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO
  7151. (Unicode:#$3359; Attr:daCompat; Ch1:#$0031; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE
  7152. (Unicode:#$335A; Attr:daCompat; Ch1:#$0032; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO
  7153. (Unicode:#$335B; Attr:daCompat; Ch1:#$0033; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE
  7154. (Unicode:#$335C; Attr:daCompat; Ch1:#$0034; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR
  7155. (Unicode:#$335D; Attr:daCompat; Ch1:#$0035; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE
  7156. (Unicode:#$335E; Attr:daCompat; Ch1:#$0036; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX
  7157. (Unicode:#$335F; Attr:daCompat; Ch1:#$0037; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN
  7158. (Unicode:#$3360; Attr:daCompat; Ch1:#$0038; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT
  7159. (Unicode:#$3361; Attr:daCompat; Ch1:#$0039; Ch2:#$70B9; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE
  7160. (Unicode:#$3362; Attr:daCompat; Ch1:#$0031; Ch2:#$0030; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN
  7161. (Unicode:#$3363; Attr:daCompat; Ch1:#$0031; Ch2:#$0031; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN
  7162. (Unicode:#$3364; Attr:daCompat; Ch1:#$0031; Ch2:#$0032; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE
  7163. (Unicode:#$3365; Attr:daCompat; Ch1:#$0031; Ch2:#$0033; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN
  7164. (Unicode:#$3366; Attr:daCompat; Ch1:#$0031; Ch2:#$0034; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN
  7165. (Unicode:#$3367; Attr:daCompat; Ch1:#$0031; Ch2:#$0035; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN
  7166. (Unicode:#$3368; Attr:daCompat; Ch1:#$0031; Ch2:#$0036; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN
  7167. (Unicode:#$3369; Attr:daCompat; Ch1:#$0031; Ch2:#$0037; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN
  7168. (Unicode:#$336A; Attr:daCompat; Ch1:#$0031; Ch2:#$0038; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN
  7169. (Unicode:#$336B; Attr:daCompat; Ch1:#$0031; Ch2:#$0039; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN
  7170. (Unicode:#$336C; Attr:daCompat; Ch1:#$0032; Ch2:#$0030; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY
  7171. (Unicode:#$336D; Attr:daCompat; Ch1:#$0032; Ch2:#$0031; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE
  7172. (Unicode:#$336E; Attr:daCompat; Ch1:#$0032; Ch2:#$0032; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO
  7173. (Unicode:#$336F; Attr:daCompat; Ch1:#$0032; Ch2:#$0033; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE
  7174. (Unicode:#$3370; Attr:daCompat; Ch1:#$0032; Ch2:#$0034; Ch3:#$70B9; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
  7175. (Unicode:#$3371; Attr:daSquare; Ch1:#$0068; Ch2:#$0050; Ch3:#$0061; Ch4:#$FFFF), // SQUARE HPA
  7176. (Unicode:#$3372; Attr:daSquare; Ch1:#$0064; Ch2:#$0061; Ch3:#$FFFF), // SQUARE DA
  7177. (Unicode:#$3373; Attr:daSquare; Ch1:#$0041; Ch2:#$0055; Ch3:#$FFFF), // SQUARE AU
  7178. (Unicode:#$3374; Attr:daSquare; Ch1:#$0062; Ch2:#$0061; Ch3:#$0072; Ch4:#$FFFF), // SQUARE BAR
  7179. (Unicode:#$3375; Attr:daSquare; Ch1:#$006F; Ch2:#$0056; Ch3:#$FFFF), // SQUARE OV
  7180. (Unicode:#$3376; Attr:daSquare; Ch1:#$0070; Ch2:#$0063; Ch3:#$FFFF), // SQUARE PC
  7181. (Unicode:#$337B; Attr:daSquare; Ch1:#$5E73; Ch2:#$6210; Ch3:#$FFFF), // SQUARE ERA NAME HEISEI
  7182. (Unicode:#$337C; Attr:daSquare; Ch1:#$662D; Ch2:#$548C; Ch3:#$FFFF), // SQUARE ERA NAME SYOUWA
  7183. (Unicode:#$337D; Attr:daSquare; Ch1:#$5927; Ch2:#$6B63; Ch3:#$FFFF), // SQUARE ERA NAME TAISYOU
  7184. (Unicode:#$337E; Attr:daSquare; Ch1:#$660E; Ch2:#$6CBB; Ch3:#$FFFF), // SQUARE ERA NAME MEIZI
  7185. (Unicode:#$337F; Attr:daSquare; Ch1:#$682A; Ch2:#$5F0F; Ch3:#$4F1A; Ch4:#$793E; Ch5:#$FFFF), // SQUARE CORPORATION
  7186. (Unicode:#$3380; Attr:daSquare; Ch1:#$0070; Ch2:#$0041; Ch3:#$FFFF), // SQUARE PA AMPS
  7187. (Unicode:#$3381; Attr:daSquare; Ch1:#$006E; Ch2:#$0041; Ch3:#$FFFF), // SQUARE NA
  7188. (Unicode:#$3382; Attr:daSquare; Ch1:#$03BC; Ch2:#$0041; Ch3:#$FFFF), // SQUARE MU A
  7189. (Unicode:#$3383; Attr:daSquare; Ch1:#$006D; Ch2:#$0041; Ch3:#$FFFF), // SQUARE MA
  7190. (Unicode:#$3384; Attr:daSquare; Ch1:#$006B; Ch2:#$0041; Ch3:#$FFFF), // SQUARE KA
  7191. (Unicode:#$3385; Attr:daSquare; Ch1:#$004B; Ch2:#$0042; Ch3:#$FFFF), // SQUARE KB
  7192. (Unicode:#$3386; Attr:daSquare; Ch1:#$004D; Ch2:#$0042; Ch3:#$FFFF), // SQUARE MB
  7193. (Unicode:#$3387; Attr:daSquare; Ch1:#$0047; Ch2:#$0042; Ch3:#$FFFF), // SQUARE GB
  7194. (Unicode:#$3388; Attr:daSquare; Ch1:#$0063; Ch2:#$0061; Ch3:#$006C; Ch4:#$FFFF), // SQUARE CAL
  7195. (Unicode:#$3389; Attr:daSquare; Ch1:#$006B; Ch2:#$0063; Ch3:#$0061; Ch4:#$006C; Ch5:#$FFFF), // SQUARE KCAL
  7196. (Unicode:#$338A; Attr:daSquare; Ch1:#$0070; Ch2:#$0046; Ch3:#$FFFF), // SQUARE PF
  7197. (Unicode:#$338B; Attr:daSquare; Ch1:#$006E; Ch2:#$0046; Ch3:#$FFFF), // SQUARE NF
  7198. (Unicode:#$338C; Attr:daSquare; Ch1:#$03BC; Ch2:#$0046; Ch3:#$FFFF), // SQUARE MU F
  7199. (Unicode:#$338D; Attr:daSquare; Ch1:#$03BC; Ch2:#$0067; Ch3:#$FFFF), // SQUARE MU G
  7200. (Unicode:#$338E; Attr:daSquare; Ch1:#$006D; Ch2:#$0067; Ch3:#$FFFF), // SQUARE MG
  7201. (Unicode:#$338F; Attr:daSquare; Ch1:#$006B; Ch2:#$0067; Ch3:#$FFFF), // SQUARE KG
  7202. (Unicode:#$3390; Attr:daSquare; Ch1:#$0048; Ch2:#$007A; Ch3:#$FFFF), // SQUARE HZ
  7203. (Unicode:#$3391; Attr:daSquare; Ch1:#$006B; Ch2:#$0048; Ch3:#$007A; Ch4:#$FFFF), // SQUARE KHZ
  7204. (Unicode:#$3392; Attr:daSquare; Ch1:#$004D; Ch2:#$0048; Ch3:#$007A; Ch4:#$FFFF), // SQUARE MHZ
  7205. (Unicode:#$3393; Attr:daSquare; Ch1:#$0047; Ch2:#$0048; Ch3:#$007A; Ch4:#$FFFF), // SQUARE GHZ
  7206. (Unicode:#$3394; Attr:daSquare; Ch1:#$0054; Ch2:#$0048; Ch3:#$007A; Ch4:#$FFFF), // SQUARE THZ
  7207. (Unicode:#$3395; Attr:daSquare; Ch1:#$03BC; Ch2:#$2113; Ch3:#$FFFF), // SQUARE MU L
  7208. (Unicode:#$3396; Attr:daSquare; Ch1:#$006D; Ch2:#$2113; Ch3:#$FFFF), // SQUARE ML
  7209. (Unicode:#$3397; Attr:daSquare; Ch1:#$0064; Ch2:#$2113; Ch3:#$FFFF), // SQUARE DL
  7210. (Unicode:#$3398; Attr:daSquare; Ch1:#$006B; Ch2:#$2113; Ch3:#$FFFF), // SQUARE KL
  7211. (Unicode:#$3399; Attr:daSquare; Ch1:#$0066; Ch2:#$006D; Ch3:#$FFFF), // SQUARE FM
  7212. (Unicode:#$339A; Attr:daSquare; Ch1:#$006E; Ch2:#$006D; Ch3:#$FFFF), // SQUARE NM
  7213. (Unicode:#$339B; Attr:daSquare; Ch1:#$03BC; Ch2:#$006D; Ch3:#$FFFF), // SQUARE MU M
  7214. (Unicode:#$339C; Attr:daSquare; Ch1:#$006D; Ch2:#$006D; Ch3:#$FFFF), // SQUARE MM
  7215. (Unicode:#$339D; Attr:daSquare; Ch1:#$0063; Ch2:#$006D; Ch3:#$FFFF), // SQUARE CM
  7216. (Unicode:#$339E; Attr:daSquare; Ch1:#$006B; Ch2:#$006D; Ch3:#$FFFF), // SQUARE KM
  7217. (Unicode:#$339F; Attr:daSquare; Ch1:#$006D; Ch2:#$006D; Ch3:#$00B2; Ch4:#$FFFF), // SQUARE MM SQUARED
  7218. (Unicode:#$33A0; Attr:daSquare; Ch1:#$0063; Ch2:#$006D; Ch3:#$00B2; Ch4:#$FFFF), // SQUARE CM SQUARED
  7219. (Unicode:#$33A1; Attr:daSquare; Ch1:#$006D; Ch2:#$00B2; Ch3:#$FFFF), // SQUARE M SQUARED
  7220. (Unicode:#$33A2; Attr:daSquare; Ch1:#$006B; Ch2:#$006D; Ch3:#$00B2; Ch4:#$FFFF), // SQUARE KM SQUARED
  7221. (Unicode:#$33A3; Attr:daSquare; Ch1:#$006D; Ch2:#$006D; Ch3:#$00B3; Ch4:#$FFFF), // SQUARE MM CUBED
  7222. (Unicode:#$33A4; Attr:daSquare; Ch1:#$0063; Ch2:#$006D; Ch3:#$00B3; Ch4:#$FFFF), // SQUARE CM CUBED
  7223. (Unicode:#$33A5; Attr:daSquare; Ch1:#$006D; Ch2:#$00B3; Ch3:#$FFFF), // SQUARE M CUBED
  7224. (Unicode:#$33A6; Attr:daSquare; Ch1:#$006B; Ch2:#$006D; Ch3:#$00B3; Ch4:#$FFFF), // SQUARE KM CUBED
  7225. (Unicode:#$33A7; Attr:daSquare; Ch1:#$006D; Ch2:#$2215; Ch3:#$0073; Ch4:#$FFFF), // SQUARE M OVER S
  7226. (Unicode:#$33A8; Attr:daSquare; Ch1:#$006D; Ch2:#$2215; Ch3:#$0073; Ch4:#$00B2; Ch5:#$FFFF), // SQUARE M OVER S SQUARED
  7227. (Unicode:#$33A9; Attr:daSquare; Ch1:#$0050; Ch2:#$0061; Ch3:#$FFFF), // SQUARE PA
  7228. (Unicode:#$33AA; Attr:daSquare; Ch1:#$006B; Ch2:#$0050; Ch3:#$0061; Ch4:#$FFFF), // SQUARE KPA
  7229. (Unicode:#$33AB; Attr:daSquare; Ch1:#$004D; Ch2:#$0050; Ch3:#$0061; Ch4:#$FFFF), // SQUARE MPA
  7230. (Unicode:#$33AC; Attr:daSquare; Ch1:#$0047; Ch2:#$0050; Ch3:#$0061; Ch4:#$FFFF), // SQUARE GPA
  7231. (Unicode:#$33AD; Attr:daSquare; Ch1:#$0072; Ch2:#$0061; Ch3:#$0064; Ch4:#$FFFF), // SQUARE RAD
  7232. (Unicode:#$33AE; Attr:daSquare; Ch1:#$0072; Ch2:#$0061; Ch3:#$0064; Ch4:#$2215; Ch5:#$0073), // SQUARE RAD OVER S
  7233. (Unicode:#$33B0; Attr:daSquare; Ch1:#$0070; Ch2:#$0073; Ch3:#$FFFF), // SQUARE PS
  7234. (Unicode:#$33B1; Attr:daSquare; Ch1:#$006E; Ch2:#$0073; Ch3:#$FFFF), // SQUARE NS
  7235. (Unicode:#$33B2; Attr:daSquare; Ch1:#$03BC; Ch2:#$0073; Ch3:#$FFFF), // SQUARE MU S
  7236. (Unicode:#$33B3; Attr:daSquare; Ch1:#$006D; Ch2:#$0073; Ch3:#$FFFF), // SQUARE MS
  7237. (Unicode:#$33B4; Attr:daSquare; Ch1:#$0070; Ch2:#$0056; Ch3:#$FFFF), // SQUARE PV
  7238. (Unicode:#$33B5; Attr:daSquare; Ch1:#$006E; Ch2:#$0056; Ch3:#$FFFF), // SQUARE NV
  7239. (Unicode:#$33B6; Attr:daSquare; Ch1:#$03BC; Ch2:#$0056; Ch3:#$FFFF), // SQUARE MU V
  7240. (Unicode:#$33B7; Attr:daSquare; Ch1:#$006D; Ch2:#$0056; Ch3:#$FFFF), // SQUARE MV
  7241. (Unicode:#$33B8; Attr:daSquare; Ch1:#$006B; Ch2:#$0056; Ch3:#$FFFF), // SQUARE KV
  7242. (Unicode:#$33B9; Attr:daSquare; Ch1:#$004D; Ch2:#$0056; Ch3:#$FFFF), // SQUARE MV MEGA
  7243. (Unicode:#$33BA; Attr:daSquare; Ch1:#$0070; Ch2:#$0057; Ch3:#$FFFF), // SQUARE PW
  7244. (Unicode:#$33BB; Attr:daSquare; Ch1:#$006E; Ch2:#$0057; Ch3:#$FFFF), // SQUARE NW
  7245. (Unicode:#$33BC; Attr:daSquare; Ch1:#$03BC; Ch2:#$0057; Ch3:#$FFFF), // SQUARE MU W
  7246. (Unicode:#$33BD; Attr:daSquare; Ch1:#$006D; Ch2:#$0057; Ch3:#$FFFF), // SQUARE MW
  7247. (Unicode:#$33BE; Attr:daSquare; Ch1:#$006B; Ch2:#$0057; Ch3:#$FFFF), // SQUARE KW
  7248. (Unicode:#$33BF; Attr:daSquare; Ch1:#$004D; Ch2:#$0057; Ch3:#$FFFF), // SQUARE MW MEGA
  7249. (Unicode:#$33C0; Attr:daSquare; Ch1:#$006B; Ch2:#$03A9; Ch3:#$FFFF), // SQUARE K OHM
  7250. (Unicode:#$33C1; Attr:daSquare; Ch1:#$004D; Ch2:#$03A9; Ch3:#$FFFF), // SQUARE M OHM
  7251. (Unicode:#$33C2; Attr:daSquare; Ch1:#$0061; Ch2:#$002E; Ch3:#$006D; Ch4:#$002E; Ch5:#$FFFF), // SQUARE AM
  7252. (Unicode:#$33C3; Attr:daSquare; Ch1:#$0042; Ch2:#$0071; Ch3:#$FFFF), // SQUARE BQ
  7253. (Unicode:#$33C4; Attr:daSquare; Ch1:#$0063; Ch2:#$0063; Ch3:#$FFFF), // SQUARE CC
  7254. (Unicode:#$33C5; Attr:daSquare; Ch1:#$0063; Ch2:#$0064; Ch3:#$FFFF), // SQUARE CD
  7255. (Unicode:#$33C6; Attr:daSquare; Ch1:#$0043; Ch2:#$2215; Ch3:#$006B; Ch4:#$0067; Ch5:#$FFFF), // SQUARE C OVER KG
  7256. (Unicode:#$33C7; Attr:daSquare; Ch1:#$0043; Ch2:#$006F; Ch3:#$002E; Ch4:#$FFFF), // SQUARE CO
  7257. (Unicode:#$33C8; Attr:daSquare; Ch1:#$0064; Ch2:#$0042; Ch3:#$FFFF), // SQUARE DB
  7258. (Unicode:#$33C9; Attr:daSquare; Ch1:#$0047; Ch2:#$0079; Ch3:#$FFFF), // SQUARE GY
  7259. (Unicode:#$33CA; Attr:daSquare; Ch1:#$0068; Ch2:#$0061; Ch3:#$FFFF), // SQUARE HA
  7260. (Unicode:#$33CB; Attr:daSquare; Ch1:#$0048; Ch2:#$0050; Ch3:#$FFFF), // SQUARE HP
  7261. (Unicode:#$33CC; Attr:daSquare; Ch1:#$0069; Ch2:#$006E; Ch3:#$FFFF), // SQUARE IN
  7262. (Unicode:#$33CD; Attr:daSquare; Ch1:#$004B; Ch2:#$004B; Ch3:#$FFFF), // SQUARE KK
  7263. (Unicode:#$33CE; Attr:daSquare; Ch1:#$004B; Ch2:#$004D; Ch3:#$FFFF), // SQUARE KM CAPITAL
  7264. (Unicode:#$33CF; Attr:daSquare; Ch1:#$006B; Ch2:#$0074; Ch3:#$FFFF), // SQUARE KT
  7265. (Unicode:#$33D0; Attr:daSquare; Ch1:#$006C; Ch2:#$006D; Ch3:#$FFFF), // SQUARE LM
  7266. (Unicode:#$33D1; Attr:daSquare; Ch1:#$006C; Ch2:#$006E; Ch3:#$FFFF), // SQUARE LN
  7267. (Unicode:#$33D2; Attr:daSquare; Ch1:#$006C; Ch2:#$006F; Ch3:#$0067; Ch4:#$FFFF), // SQUARE LOG
  7268. (Unicode:#$33D3; Attr:daSquare; Ch1:#$006C; Ch2:#$0078; Ch3:#$FFFF), // SQUARE LX
  7269. (Unicode:#$33D4; Attr:daSquare; Ch1:#$006D; Ch2:#$0062; Ch3:#$FFFF), // SQUARE MB SMALL
  7270. (Unicode:#$33D5; Attr:daSquare; Ch1:#$006D; Ch2:#$0069; Ch3:#$006C; Ch4:#$FFFF), // SQUARE MIL
  7271. (Unicode:#$33D6; Attr:daSquare; Ch1:#$006D; Ch2:#$006F; Ch3:#$006C; Ch4:#$FFFF), // SQUARE MOL
  7272. (Unicode:#$33D7; Attr:daSquare; Ch1:#$0050; Ch2:#$0048; Ch3:#$FFFF), // SQUARE PH
  7273. (Unicode:#$33D8; Attr:daSquare; Ch1:#$0070; Ch2:#$002E; Ch3:#$006D; Ch4:#$002E; Ch5:#$FFFF), // SQUARE PM
  7274. (Unicode:#$33D9; Attr:daSquare; Ch1:#$0050; Ch2:#$0050; Ch3:#$004D; Ch4:#$FFFF), // SQUARE PPM
  7275. (Unicode:#$33DA; Attr:daSquare; Ch1:#$0050; Ch2:#$0052; Ch3:#$FFFF), // SQUARE PR
  7276. (Unicode:#$33DB; Attr:daSquare; Ch1:#$0073; Ch2:#$0072; Ch3:#$FFFF), // SQUARE SR
  7277. (Unicode:#$33DC; Attr:daSquare; Ch1:#$0053; Ch2:#$0076; Ch3:#$FFFF), // SQUARE SV
  7278. (Unicode:#$33DD; Attr:daSquare; Ch1:#$0057; Ch2:#$0062; Ch3:#$FFFF), // SQUARE WB
  7279. (Unicode:#$33E0; Attr:daCompat; Ch1:#$0031; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE
  7280. (Unicode:#$33E1; Attr:daCompat; Ch1:#$0032; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO
  7281. (Unicode:#$33E2; Attr:daCompat; Ch1:#$0033; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE
  7282. (Unicode:#$33E3; Attr:daCompat; Ch1:#$0034; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR
  7283. (Unicode:#$33E4; Attr:daCompat; Ch1:#$0035; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE
  7284. (Unicode:#$33E5; Attr:daCompat; Ch1:#$0036; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX
  7285. (Unicode:#$33E6; Attr:daCompat; Ch1:#$0037; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN
  7286. (Unicode:#$33E7; Attr:daCompat; Ch1:#$0038; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT
  7287. (Unicode:#$33E8; Attr:daCompat; Ch1:#$0039; Ch2:#$65E5; Ch3:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE
  7288. (Unicode:#$33E9; Attr:daCompat; Ch1:#$0031; Ch2:#$0030; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN
  7289. (Unicode:#$33EA; Attr:daCompat; Ch1:#$0031; Ch2:#$0031; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN
  7290. (Unicode:#$33EB; Attr:daCompat; Ch1:#$0031; Ch2:#$0032; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE
  7291. (Unicode:#$33EC; Attr:daCompat; Ch1:#$0031; Ch2:#$0033; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN
  7292. (Unicode:#$33ED; Attr:daCompat; Ch1:#$0031; Ch2:#$0034; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN
  7293. (Unicode:#$33EE; Attr:daCompat; Ch1:#$0031; Ch2:#$0035; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN
  7294. (Unicode:#$33EF; Attr:daCompat; Ch1:#$0031; Ch2:#$0036; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN
  7295. (Unicode:#$33F0; Attr:daCompat; Ch1:#$0031; Ch2:#$0037; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN
  7296. (Unicode:#$33F1; Attr:daCompat; Ch1:#$0031; Ch2:#$0038; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN
  7297. (Unicode:#$33F2; Attr:daCompat; Ch1:#$0031; Ch2:#$0039; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN
  7298. (Unicode:#$33F3; Attr:daCompat; Ch1:#$0032; Ch2:#$0030; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY
  7299. (Unicode:#$33F4; Attr:daCompat; Ch1:#$0032; Ch2:#$0031; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE
  7300. (Unicode:#$33F5; Attr:daCompat; Ch1:#$0032; Ch2:#$0032; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO
  7301. (Unicode:#$33F6; Attr:daCompat; Ch1:#$0032; Ch2:#$0033; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE
  7302. (Unicode:#$33F7; Attr:daCompat; Ch1:#$0032; Ch2:#$0034; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR
  7303. (Unicode:#$33F8; Attr:daCompat; Ch1:#$0032; Ch2:#$0035; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE
  7304. (Unicode:#$33F9; Attr:daCompat; Ch1:#$0032; Ch2:#$0036; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX
  7305. (Unicode:#$33FA; Attr:daCompat; Ch1:#$0032; Ch2:#$0037; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN
  7306. (Unicode:#$33FB; Attr:daCompat; Ch1:#$0032; Ch2:#$0038; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT
  7307. (Unicode:#$33FC; Attr:daCompat; Ch1:#$0032; Ch2:#$0039; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE
  7308. (Unicode:#$33FD; Attr:daCompat; Ch1:#$0033; Ch2:#$0030; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY
  7309. (Unicode:#$33FE; Attr:daCompat; Ch1:#$0033; Ch2:#$0031; Ch3:#$65E5; Ch4:#$FFFF), // IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
  7310. (Unicode:#$F900; Attr:daNone; Ch1:#$8C48; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F900
  7311. (Unicode:#$F901; Attr:daNone; Ch1:#$66F4; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F901
  7312. (Unicode:#$F902; Attr:daNone; Ch1:#$8ECA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F902
  7313. (Unicode:#$F903; Attr:daNone; Ch1:#$8CC8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F903
  7314. (Unicode:#$F904; Attr:daNone; Ch1:#$6ED1; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F904
  7315. (Unicode:#$F905; Attr:daNone; Ch1:#$4E32; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F905
  7316. (Unicode:#$F906; Attr:daNone; Ch1:#$53E5; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F906
  7317. (Unicode:#$F907; Attr:daNone; Ch1:#$9F9C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F907
  7318. (Unicode:#$F908; Attr:daNone; Ch1:#$9F9C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F908
  7319. (Unicode:#$F909; Attr:daNone; Ch1:#$5951; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F909
  7320. (Unicode:#$F90A; Attr:daNone; Ch1:#$91D1; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F90A
  7321. (Unicode:#$F90B; Attr:daNone; Ch1:#$5587; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F90B
  7322. (Unicode:#$F90C; Attr:daNone; Ch1:#$5948; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F90C
  7323. (Unicode:#$F90D; Attr:daNone; Ch1:#$61F6; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F90D
  7324. (Unicode:#$F90E; Attr:daNone; Ch1:#$7669; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F90E
  7325. (Unicode:#$F90F; Attr:daNone; Ch1:#$7F85; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F90F
  7326. (Unicode:#$F910; Attr:daNone; Ch1:#$863F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F910
  7327. (Unicode:#$F911; Attr:daNone; Ch1:#$87BA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F911
  7328. (Unicode:#$F912; Attr:daNone; Ch1:#$88F8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F912
  7329. (Unicode:#$F913; Attr:daNone; Ch1:#$908F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F913
  7330. (Unicode:#$F914; Attr:daNone; Ch1:#$6A02; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F914
  7331. (Unicode:#$F915; Attr:daNone; Ch1:#$6D1B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F915
  7332. (Unicode:#$F916; Attr:daNone; Ch1:#$70D9; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F916
  7333. (Unicode:#$F917; Attr:daNone; Ch1:#$73DE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F917
  7334. (Unicode:#$F918; Attr:daNone; Ch1:#$843D; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F918
  7335. (Unicode:#$F919; Attr:daNone; Ch1:#$916A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F919
  7336. (Unicode:#$F91A; Attr:daNone; Ch1:#$99F1; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F91A
  7337. (Unicode:#$F91B; Attr:daNone; Ch1:#$4E82; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F91B
  7338. (Unicode:#$F91C; Attr:daNone; Ch1:#$5375; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F91C
  7339. (Unicode:#$F91D; Attr:daNone; Ch1:#$6B04; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F91D
  7340. (Unicode:#$F91E; Attr:daNone; Ch1:#$721B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F91E
  7341. (Unicode:#$F91F; Attr:daNone; Ch1:#$862D; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F91F
  7342. (Unicode:#$F920; Attr:daNone; Ch1:#$9E1E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F920
  7343. (Unicode:#$F921; Attr:daNone; Ch1:#$5D50; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F921
  7344. (Unicode:#$F922; Attr:daNone; Ch1:#$6FEB; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F922
  7345. (Unicode:#$F923; Attr:daNone; Ch1:#$85CD; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F923
  7346. (Unicode:#$F924; Attr:daNone; Ch1:#$8964; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F924
  7347. (Unicode:#$F925; Attr:daNone; Ch1:#$62C9; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F925
  7348. (Unicode:#$F926; Attr:daNone; Ch1:#$81D8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F926
  7349. (Unicode:#$F927; Attr:daNone; Ch1:#$881F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F927
  7350. (Unicode:#$F928; Attr:daNone; Ch1:#$5ECA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F928
  7351. (Unicode:#$F929; Attr:daNone; Ch1:#$6717; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F929
  7352. (Unicode:#$F92A; Attr:daNone; Ch1:#$6D6A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F92A
  7353. (Unicode:#$F92B; Attr:daNone; Ch1:#$72FC; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F92B
  7354. (Unicode:#$F92C; Attr:daNone; Ch1:#$90CE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F92C
  7355. (Unicode:#$F92D; Attr:daNone; Ch1:#$4F86; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F92D
  7356. (Unicode:#$F92E; Attr:daNone; Ch1:#$51B7; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F92E
  7357. (Unicode:#$F92F; Attr:daNone; Ch1:#$52DE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F92F
  7358. (Unicode:#$F930; Attr:daNone; Ch1:#$64C4; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F930
  7359. (Unicode:#$F931; Attr:daNone; Ch1:#$6AD3; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F931
  7360. (Unicode:#$F932; Attr:daNone; Ch1:#$7210; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F932
  7361. (Unicode:#$F933; Attr:daNone; Ch1:#$76E7; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F933
  7362. (Unicode:#$F934; Attr:daNone; Ch1:#$8001; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F934
  7363. (Unicode:#$F935; Attr:daNone; Ch1:#$8606; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F935
  7364. (Unicode:#$F936; Attr:daNone; Ch1:#$865C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F936
  7365. (Unicode:#$F937; Attr:daNone; Ch1:#$8DEF; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F937
  7366. (Unicode:#$F938; Attr:daNone; Ch1:#$9732; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F938
  7367. (Unicode:#$F939; Attr:daNone; Ch1:#$9B6F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F939
  7368. (Unicode:#$F93A; Attr:daNone; Ch1:#$9DFA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F93A
  7369. (Unicode:#$F93B; Attr:daNone; Ch1:#$788C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F93B
  7370. (Unicode:#$F93C; Attr:daNone; Ch1:#$797F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F93C
  7371. (Unicode:#$F93D; Attr:daNone; Ch1:#$7DA0; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F93D
  7372. (Unicode:#$F93E; Attr:daNone; Ch1:#$83C9; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F93E
  7373. (Unicode:#$F93F; Attr:daNone; Ch1:#$9304; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F93F
  7374. (Unicode:#$F940; Attr:daNone; Ch1:#$9E7F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F940
  7375. (Unicode:#$F941; Attr:daNone; Ch1:#$8AD6; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F941
  7376. (Unicode:#$F942; Attr:daNone; Ch1:#$58DF; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F942
  7377. (Unicode:#$F943; Attr:daNone; Ch1:#$5F04; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F943
  7378. (Unicode:#$F944; Attr:daNone; Ch1:#$7C60; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F944
  7379. (Unicode:#$F945; Attr:daNone; Ch1:#$807E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F945
  7380. (Unicode:#$F946; Attr:daNone; Ch1:#$7262; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F946
  7381. (Unicode:#$F947; Attr:daNone; Ch1:#$78CA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F947
  7382. (Unicode:#$F948; Attr:daNone; Ch1:#$8CC2; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F948
  7383. (Unicode:#$F949; Attr:daNone; Ch1:#$96F7; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F949
  7384. (Unicode:#$F94A; Attr:daNone; Ch1:#$58D8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F94A
  7385. (Unicode:#$F94B; Attr:daNone; Ch1:#$5C62; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F94B
  7386. (Unicode:#$F94C; Attr:daNone; Ch1:#$6A13; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F94C
  7387. (Unicode:#$F94D; Attr:daNone; Ch1:#$6DDA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F94D
  7388. (Unicode:#$F94E; Attr:daNone; Ch1:#$6F0F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F94E
  7389. (Unicode:#$F94F; Attr:daNone; Ch1:#$7D2F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F94F
  7390. (Unicode:#$F950; Attr:daNone; Ch1:#$7E37; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F950
  7391. (Unicode:#$F951; Attr:daNone; Ch1:#$96FB; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F951
  7392. (Unicode:#$F952; Attr:daNone; Ch1:#$52D2; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F952
  7393. (Unicode:#$F953; Attr:daNone; Ch1:#$808B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F953
  7394. (Unicode:#$F954; Attr:daNone; Ch1:#$51DC; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F954
  7395. (Unicode:#$F955; Attr:daNone; Ch1:#$51CC; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F955
  7396. (Unicode:#$F956; Attr:daNone; Ch1:#$7A1C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F956
  7397. (Unicode:#$F957; Attr:daNone; Ch1:#$7DBE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F957
  7398. (Unicode:#$F958; Attr:daNone; Ch1:#$83F1; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F958
  7399. (Unicode:#$F959; Attr:daNone; Ch1:#$9675; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F959
  7400. (Unicode:#$F95A; Attr:daNone; Ch1:#$8B80; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F95A
  7401. (Unicode:#$F95B; Attr:daNone; Ch1:#$62CF; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F95B
  7402. (Unicode:#$F95C; Attr:daNone; Ch1:#$6A02; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F95C
  7403. (Unicode:#$F95D; Attr:daNone; Ch1:#$8AFE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F95D
  7404. (Unicode:#$F95E; Attr:daNone; Ch1:#$4E39; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F95E
  7405. (Unicode:#$F95F; Attr:daNone; Ch1:#$5BE7; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F95F
  7406. (Unicode:#$F960; Attr:daNone; Ch1:#$6012; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F960
  7407. (Unicode:#$F961; Attr:daNone; Ch1:#$7387; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F961
  7408. (Unicode:#$F962; Attr:daNone; Ch1:#$7570; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F962
  7409. (Unicode:#$F963; Attr:daNone; Ch1:#$5317; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F963
  7410. (Unicode:#$F964; Attr:daNone; Ch1:#$78FB; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F964
  7411. (Unicode:#$F965; Attr:daNone; Ch1:#$4FBF; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F965
  7412. (Unicode:#$F966; Attr:daNone; Ch1:#$5FA9; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F966
  7413. (Unicode:#$F967; Attr:daNone; Ch1:#$4E0D; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F967
  7414. (Unicode:#$F968; Attr:daNone; Ch1:#$6CCC; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F968
  7415. (Unicode:#$F969; Attr:daNone; Ch1:#$6578; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F969
  7416. (Unicode:#$F96A; Attr:daNone; Ch1:#$7D22; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F96A
  7417. (Unicode:#$F96B; Attr:daNone; Ch1:#$53C3; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F96B
  7418. (Unicode:#$F96C; Attr:daNone; Ch1:#$585E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F96C
  7419. (Unicode:#$F96D; Attr:daNone; Ch1:#$7701; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F96D
  7420. (Unicode:#$F96E; Attr:daNone; Ch1:#$8449; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F96E
  7421. (Unicode:#$F96F; Attr:daNone; Ch1:#$8AAA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F96F
  7422. (Unicode:#$F970; Attr:daNone; Ch1:#$6BBA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F970
  7423. (Unicode:#$F971; Attr:daNone; Ch1:#$8FB0; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F971
  7424. (Unicode:#$F972; Attr:daNone; Ch1:#$6C88; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F972
  7425. (Unicode:#$F973; Attr:daNone; Ch1:#$62FE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F973
  7426. (Unicode:#$F974; Attr:daNone; Ch1:#$82E5; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F974
  7427. (Unicode:#$F975; Attr:daNone; Ch1:#$63A0; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F975
  7428. (Unicode:#$F976; Attr:daNone; Ch1:#$7565; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F976
  7429. (Unicode:#$F977; Attr:daNone; Ch1:#$4EAE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F977
  7430. (Unicode:#$F978; Attr:daNone; Ch1:#$5169; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F978
  7431. (Unicode:#$F979; Attr:daNone; Ch1:#$51C9; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F979
  7432. (Unicode:#$F97A; Attr:daNone; Ch1:#$6881; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F97A
  7433. (Unicode:#$F97B; Attr:daNone; Ch1:#$7CE7; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F97B
  7434. (Unicode:#$F97C; Attr:daNone; Ch1:#$826F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F97C
  7435. (Unicode:#$F97D; Attr:daNone; Ch1:#$8AD2; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F97D
  7436. (Unicode:#$F97E; Attr:daNone; Ch1:#$91CF; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F97E
  7437. (Unicode:#$F97F; Attr:daNone; Ch1:#$52F5; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F97F
  7438. (Unicode:#$F980; Attr:daNone; Ch1:#$5442; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F980
  7439. (Unicode:#$F981; Attr:daNone; Ch1:#$5973; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F981
  7440. (Unicode:#$F982; Attr:daNone; Ch1:#$5EEC; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F982
  7441. (Unicode:#$F983; Attr:daNone; Ch1:#$65C5; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F983
  7442. (Unicode:#$F984; Attr:daNone; Ch1:#$6FFE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F984
  7443. (Unicode:#$F985; Attr:daNone; Ch1:#$792A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F985
  7444. (Unicode:#$F986; Attr:daNone; Ch1:#$95AD; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F986
  7445. (Unicode:#$F987; Attr:daNone; Ch1:#$9A6A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F987
  7446. (Unicode:#$F988; Attr:daNone; Ch1:#$9E97; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F988
  7447. (Unicode:#$F989; Attr:daNone; Ch1:#$9ECE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F989
  7448. (Unicode:#$F98A; Attr:daNone; Ch1:#$529B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F98A
  7449. (Unicode:#$F98B; Attr:daNone; Ch1:#$66C6; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F98B
  7450. (Unicode:#$F98C; Attr:daNone; Ch1:#$6B77; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F98C
  7451. (Unicode:#$F98D; Attr:daNone; Ch1:#$8F62; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F98D
  7452. (Unicode:#$F98E; Attr:daNone; Ch1:#$5E74; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F98E
  7453. (Unicode:#$F98F; Attr:daNone; Ch1:#$6190; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F98F
  7454. (Unicode:#$F990; Attr:daNone; Ch1:#$6200; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F990
  7455. (Unicode:#$F991; Attr:daNone; Ch1:#$649A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F991
  7456. (Unicode:#$F992; Attr:daNone; Ch1:#$6F23; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F992
  7457. (Unicode:#$F993; Attr:daNone; Ch1:#$7149; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F993
  7458. (Unicode:#$F994; Attr:daNone; Ch1:#$7489; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F994
  7459. (Unicode:#$F995; Attr:daNone; Ch1:#$79CA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F995
  7460. (Unicode:#$F996; Attr:daNone; Ch1:#$7DF4; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F996
  7461. (Unicode:#$F997; Attr:daNone; Ch1:#$806F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F997
  7462. (Unicode:#$F998; Attr:daNone; Ch1:#$8F26; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F998
  7463. (Unicode:#$F999; Attr:daNone; Ch1:#$84EE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F999
  7464. (Unicode:#$F99A; Attr:daNone; Ch1:#$9023; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F99A
  7465. (Unicode:#$F99B; Attr:daNone; Ch1:#$934A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F99B
  7466. (Unicode:#$F99C; Attr:daNone; Ch1:#$5217; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F99C
  7467. (Unicode:#$F99D; Attr:daNone; Ch1:#$52A3; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F99D
  7468. (Unicode:#$F99E; Attr:daNone; Ch1:#$54BD; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F99E
  7469. (Unicode:#$F99F; Attr:daNone; Ch1:#$70C8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F99F
  7470. (Unicode:#$F9A0; Attr:daNone; Ch1:#$88C2; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A0
  7471. (Unicode:#$F9A1; Attr:daNone; Ch1:#$8AAA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A1
  7472. (Unicode:#$F9A2; Attr:daNone; Ch1:#$5EC9; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A2
  7473. (Unicode:#$F9A3; Attr:daNone; Ch1:#$5FF5; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A3
  7474. (Unicode:#$F9A4; Attr:daNone; Ch1:#$637B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A4
  7475. (Unicode:#$F9A5; Attr:daNone; Ch1:#$6BAE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A5
  7476. (Unicode:#$F9A6; Attr:daNone; Ch1:#$7C3E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A6
  7477. (Unicode:#$F9A7; Attr:daNone; Ch1:#$7375; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A7
  7478. (Unicode:#$F9A8; Attr:daNone; Ch1:#$4EE4; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A8
  7479. (Unicode:#$F9A9; Attr:daNone; Ch1:#$56F9; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9A9
  7480. (Unicode:#$F9AA; Attr:daNone; Ch1:#$5BE7; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9AA
  7481. (Unicode:#$F9AB; Attr:daNone; Ch1:#$5DBA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9AB
  7482. (Unicode:#$F9AC; Attr:daNone; Ch1:#$601C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9AC
  7483. (Unicode:#$F9AD; Attr:daNone; Ch1:#$73B2; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9AD
  7484. (Unicode:#$F9AE; Attr:daNone; Ch1:#$7469; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9AE
  7485. (Unicode:#$F9AF; Attr:daNone; Ch1:#$7F9A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9AF
  7486. (Unicode:#$F9B0; Attr:daNone; Ch1:#$8046; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B0
  7487. (Unicode:#$F9B1; Attr:daNone; Ch1:#$9234; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B1
  7488. (Unicode:#$F9B2; Attr:daNone; Ch1:#$96F6; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B2
  7489. (Unicode:#$F9B3; Attr:daNone; Ch1:#$9748; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B3
  7490. (Unicode:#$F9B4; Attr:daNone; Ch1:#$9818; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B4
  7491. (Unicode:#$F9B5; Attr:daNone; Ch1:#$4F8B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B5
  7492. (Unicode:#$F9B6; Attr:daNone; Ch1:#$79AE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B6
  7493. (Unicode:#$F9B7; Attr:daNone; Ch1:#$91B4; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B7
  7494. (Unicode:#$F9B8; Attr:daNone; Ch1:#$96B8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B8
  7495. (Unicode:#$F9B9; Attr:daNone; Ch1:#$60E1; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9B9
  7496. (Unicode:#$F9BA; Attr:daNone; Ch1:#$4E86; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9BA
  7497. (Unicode:#$F9BB; Attr:daNone; Ch1:#$50DA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9BB
  7498. (Unicode:#$F9BC; Attr:daNone; Ch1:#$5BEE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9BC
  7499. (Unicode:#$F9BD; Attr:daNone; Ch1:#$5C3F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9BD
  7500. (Unicode:#$F9BE; Attr:daNone; Ch1:#$6599; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9BE
  7501. (Unicode:#$F9BF; Attr:daNone; Ch1:#$6A02; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9BF
  7502. (Unicode:#$F9C0; Attr:daNone; Ch1:#$71CE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C0
  7503. (Unicode:#$F9C1; Attr:daNone; Ch1:#$7642; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C1
  7504. (Unicode:#$F9C2; Attr:daNone; Ch1:#$84FC; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C2
  7505. (Unicode:#$F9C3; Attr:daNone; Ch1:#$907C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C3
  7506. (Unicode:#$F9C4; Attr:daNone; Ch1:#$9F8D; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C4
  7507. (Unicode:#$F9C5; Attr:daNone; Ch1:#$6688; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C5
  7508. (Unicode:#$F9C6; Attr:daNone; Ch1:#$962E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C6
  7509. (Unicode:#$F9C7; Attr:daNone; Ch1:#$5289; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C7
  7510. (Unicode:#$F9C8; Attr:daNone; Ch1:#$677B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C8
  7511. (Unicode:#$F9C9; Attr:daNone; Ch1:#$67F3; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9C9
  7512. (Unicode:#$F9CA; Attr:daNone; Ch1:#$6D41; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9CA
  7513. (Unicode:#$F9CB; Attr:daNone; Ch1:#$6E9C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9CB
  7514. (Unicode:#$F9CC; Attr:daNone; Ch1:#$7409; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9CC
  7515. (Unicode:#$F9CD; Attr:daNone; Ch1:#$7559; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9CD
  7516. (Unicode:#$F9CE; Attr:daNone; Ch1:#$786B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9CE
  7517. (Unicode:#$F9CF; Attr:daNone; Ch1:#$7D10; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9CF
  7518. (Unicode:#$F9D0; Attr:daNone; Ch1:#$985E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D0
  7519. (Unicode:#$F9D1; Attr:daNone; Ch1:#$516D; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D1
  7520. (Unicode:#$F9D2; Attr:daNone; Ch1:#$622E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D2
  7521. (Unicode:#$F9D3; Attr:daNone; Ch1:#$9678; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D3
  7522. (Unicode:#$F9D4; Attr:daNone; Ch1:#$502B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D4
  7523. (Unicode:#$F9D5; Attr:daNone; Ch1:#$5D19; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D5
  7524. (Unicode:#$F9D6; Attr:daNone; Ch1:#$6DEA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D6
  7525. (Unicode:#$F9D7; Attr:daNone; Ch1:#$8F2A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D7
  7526. (Unicode:#$F9D8; Attr:daNone; Ch1:#$5F8B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D8
  7527. (Unicode:#$F9D9; Attr:daNone; Ch1:#$6144; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9D9
  7528. (Unicode:#$F9DA; Attr:daNone; Ch1:#$6817; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9DA
  7529. (Unicode:#$F9DB; Attr:daNone; Ch1:#$7387; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9DB
  7530. (Unicode:#$F9DC; Attr:daNone; Ch1:#$9686; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9DC
  7531. (Unicode:#$F9DD; Attr:daNone; Ch1:#$5229; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9DD
  7532. (Unicode:#$F9DE; Attr:daNone; Ch1:#$540F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9DE
  7533. (Unicode:#$F9DF; Attr:daNone; Ch1:#$5C65; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9DF
  7534. (Unicode:#$F9E0; Attr:daNone; Ch1:#$6613; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E0
  7535. (Unicode:#$F9E1; Attr:daNone; Ch1:#$674E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E1
  7536. (Unicode:#$F9E2; Attr:daNone; Ch1:#$68A8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E2
  7537. (Unicode:#$F9E3; Attr:daNone; Ch1:#$6CE5; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E3
  7538. (Unicode:#$F9E4; Attr:daNone; Ch1:#$7406; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E4
  7539. (Unicode:#$F9E5; Attr:daNone; Ch1:#$75E2; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E5
  7540. (Unicode:#$F9E6; Attr:daNone; Ch1:#$7F79; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E6
  7541. (Unicode:#$F9E7; Attr:daNone; Ch1:#$88CF; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E7
  7542. (Unicode:#$F9E8; Attr:daNone; Ch1:#$88E1; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E8
  7543. (Unicode:#$F9E9; Attr:daNone; Ch1:#$91CC; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9E9
  7544. (Unicode:#$F9EA; Attr:daNone; Ch1:#$96E2; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9EA
  7545. (Unicode:#$F9EB; Attr:daNone; Ch1:#$533F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9EB
  7546. (Unicode:#$F9EC; Attr:daNone; Ch1:#$6EBA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9EC
  7547. (Unicode:#$F9ED; Attr:daNone; Ch1:#$541D; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9ED
  7548. (Unicode:#$F9EE; Attr:daNone; Ch1:#$71D0; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9EE
  7549. (Unicode:#$F9EF; Attr:daNone; Ch1:#$7498; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9EF
  7550. (Unicode:#$F9F0; Attr:daNone; Ch1:#$85FA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F0
  7551. (Unicode:#$F9F1; Attr:daNone; Ch1:#$96A3; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F1
  7552. (Unicode:#$F9F2; Attr:daNone; Ch1:#$9C57; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F2
  7553. (Unicode:#$F9F3; Attr:daNone; Ch1:#$9E9F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F3
  7554. (Unicode:#$F9F4; Attr:daNone; Ch1:#$6797; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F4
  7555. (Unicode:#$F9F5; Attr:daNone; Ch1:#$6DCB; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F5
  7556. (Unicode:#$F9F6; Attr:daNone; Ch1:#$81E8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F6
  7557. (Unicode:#$F9F7; Attr:daNone; Ch1:#$7ACB; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F7
  7558. (Unicode:#$F9F8; Attr:daNone; Ch1:#$7B20; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F8
  7559. (Unicode:#$F9F9; Attr:daNone; Ch1:#$7C92; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9F9
  7560. (Unicode:#$F9FA; Attr:daNone; Ch1:#$72C0; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9FA
  7561. (Unicode:#$F9FB; Attr:daNone; Ch1:#$7099; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9FB
  7562. (Unicode:#$F9FC; Attr:daNone; Ch1:#$8B58; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9FC
  7563. (Unicode:#$F9FD; Attr:daNone; Ch1:#$4EC0; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9FD
  7564. (Unicode:#$F9FE; Attr:daNone; Ch1:#$8336; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9FE
  7565. (Unicode:#$F9FF; Attr:daNone; Ch1:#$523A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-F9FF
  7566. (Unicode:#$FA00; Attr:daNone; Ch1:#$5207; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA00
  7567. (Unicode:#$FA01; Attr:daNone; Ch1:#$5EA6; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA01
  7568. (Unicode:#$FA02; Attr:daNone; Ch1:#$62D3; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA02
  7569. (Unicode:#$FA03; Attr:daNone; Ch1:#$7CD6; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA03
  7570. (Unicode:#$FA04; Attr:daNone; Ch1:#$5B85; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA04
  7571. (Unicode:#$FA05; Attr:daNone; Ch1:#$6D1E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA05
  7572. (Unicode:#$FA06; Attr:daNone; Ch1:#$66B4; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA06
  7573. (Unicode:#$FA07; Attr:daNone; Ch1:#$8F3B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA07
  7574. (Unicode:#$FA08; Attr:daNone; Ch1:#$884C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA08
  7575. (Unicode:#$FA09; Attr:daNone; Ch1:#$964D; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA09
  7576. (Unicode:#$FA0A; Attr:daNone; Ch1:#$898B; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA0A
  7577. (Unicode:#$FA0B; Attr:daNone; Ch1:#$5ED3; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA0B
  7578. (Unicode:#$FA0C; Attr:daNone; Ch1:#$5140; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA0C
  7579. (Unicode:#$FA0D; Attr:daNone; Ch1:#$55C0; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA0D
  7580. (Unicode:#$FA10; Attr:daNone; Ch1:#$585A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA10
  7581. (Unicode:#$FA12; Attr:daNone; Ch1:#$6674; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA12
  7582. (Unicode:#$FA15; Attr:daNone; Ch1:#$51DE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA15
  7583. (Unicode:#$FA16; Attr:daNone; Ch1:#$732A; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA16
  7584. (Unicode:#$FA17; Attr:daNone; Ch1:#$76CA; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA17
  7585. (Unicode:#$FA18; Attr:daNone; Ch1:#$793C; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA18
  7586. (Unicode:#$FA19; Attr:daNone; Ch1:#$795E; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA19
  7587. (Unicode:#$FA1A; Attr:daNone; Ch1:#$7965; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA1A
  7588. (Unicode:#$FA1B; Attr:daNone; Ch1:#$798F; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA1B
  7589. (Unicode:#$FA1C; Attr:daNone; Ch1:#$9756; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA1C
  7590. (Unicode:#$FA1D; Attr:daNone; Ch1:#$7CBE; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA1D
  7591. (Unicode:#$FA1E; Attr:daNone; Ch1:#$7FBD; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA1E
  7592. (Unicode:#$FA20; Attr:daNone; Ch1:#$8612; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA20
  7593. (Unicode:#$FA22; Attr:daNone; Ch1:#$8AF8; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA22
  7594. (Unicode:#$FA25; Attr:daNone; Ch1:#$9038; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA25
  7595. (Unicode:#$FA26; Attr:daNone; Ch1:#$90FD; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA26
  7596. (Unicode:#$FA2A; Attr:daNone; Ch1:#$98EF; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA2A
  7597. (Unicode:#$FA2B; Attr:daNone; Ch1:#$98FC; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA2B
  7598. (Unicode:#$FA2C; Attr:daNone; Ch1:#$9928; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA2C
  7599. (Unicode:#$FA2D; Attr:daNone; Ch1:#$9DB4; Ch2:#$FFFF), // CJK COMPATIBILITY IDEOGRAPH-FA2D
  7600. (Unicode:#$FB00; Attr:daCompat; Ch1:#$0066; Ch2:#$0066; Ch3:#$FFFF), // LATIN SMALL LIGATURE FF
  7601. (Unicode:#$FB01; Attr:daCompat; Ch1:#$0066; Ch2:#$0069; Ch3:#$FFFF), // LATIN SMALL LIGATURE FI
  7602. (Unicode:#$FB02; Attr:daCompat; Ch1:#$0066; Ch2:#$006C; Ch3:#$FFFF), // LATIN SMALL LIGATURE FL
  7603. (Unicode:#$FB03; Attr:daCompat; Ch1:#$0066; Ch2:#$0066; Ch3:#$0069; Ch4:#$FFFF), // LATIN SMALL LIGATURE FFI
  7604. (Unicode:#$FB04; Attr:daCompat; Ch1:#$0066; Ch2:#$0066; Ch3:#$006C; Ch4:#$FFFF), // LATIN SMALL LIGATURE FFL
  7605. (Unicode:#$FB05; Attr:daCompat; Ch1:#$017F; Ch2:#$0074; Ch3:#$FFFF), // LATIN SMALL LIGATURE LONG S T
  7606. (Unicode:#$FB06; Attr:daCompat; Ch1:#$0073; Ch2:#$0074; Ch3:#$FFFF), // LATIN SMALL LIGATURE ST
  7607. (Unicode:#$FB13; Attr:daCompat; Ch1:#$0574; Ch2:#$0576; Ch3:#$FFFF), // ARMENIAN SMALL LIGATURE MEN NOW
  7608. (Unicode:#$FB14; Attr:daCompat; Ch1:#$0574; Ch2:#$0565; Ch3:#$FFFF), // ARMENIAN SMALL LIGATURE MEN ECH
  7609. (Unicode:#$FB15; Attr:daCompat; Ch1:#$0574; Ch2:#$056B; Ch3:#$FFFF), // ARMENIAN SMALL LIGATURE MEN INI
  7610. (Unicode:#$FB16; Attr:daCompat; Ch1:#$057E; Ch2:#$0576; Ch3:#$FFFF), // ARMENIAN SMALL LIGATURE VEW NOW
  7611. (Unicode:#$FB17; Attr:daCompat; Ch1:#$0574; Ch2:#$056D; Ch3:#$FFFF), // ARMENIAN SMALL LIGATURE MEN XEH
  7612. (Unicode:#$FB1D; Attr:daNone; Ch1:#$05D9; Ch2:#$05B4; Ch3:#$FFFF), // HEBREW LETTER YOD WITH HIRIQ
  7613. (Unicode:#$FB1F; Attr:daNone; Ch1:#$05F2; Ch2:#$05B7; Ch3:#$FFFF), // HEBREW LIGATURE YIDDISH YOD YOD PATAH
  7614. (Unicode:#$FB20; Attr:daFont; Ch1:#$05E2; Ch2:#$FFFF), // HEBREW LETTER ALTERNATIVE AYIN
  7615. (Unicode:#$FB21; Attr:daFont; Ch1:#$05D0; Ch2:#$FFFF), // HEBREW LETTER WIDE ALEF
  7616. (Unicode:#$FB22; Attr:daFont; Ch1:#$05D3; Ch2:#$FFFF), // HEBREW LETTER WIDE DALET
  7617. (Unicode:#$FB23; Attr:daFont; Ch1:#$05D4; Ch2:#$FFFF), // HEBREW LETTER WIDE HE
  7618. (Unicode:#$FB24; Attr:daFont; Ch1:#$05DB; Ch2:#$FFFF), // HEBREW LETTER WIDE KAF
  7619. (Unicode:#$FB25; Attr:daFont; Ch1:#$05DC; Ch2:#$FFFF), // HEBREW LETTER WIDE LAMED
  7620. (Unicode:#$FB26; Attr:daFont; Ch1:#$05DD; Ch2:#$FFFF), // HEBREW LETTER WIDE FINAL MEM
  7621. (Unicode:#$FB27; Attr:daFont; Ch1:#$05E8; Ch2:#$FFFF), // HEBREW LETTER WIDE RESH
  7622. (Unicode:#$FB28; Attr:daFont; Ch1:#$05EA; Ch2:#$FFFF), // HEBREW LETTER WIDE TAV
  7623. (Unicode:#$FB29; Attr:daFont; Ch1:#$002B; Ch2:#$FFFF), // HEBREW LETTER ALTERNATIVE PLUS SIGN
  7624. (Unicode:#$FB2A; Attr:daNone; Ch1:#$05E9; Ch2:#$05C1; Ch3:#$FFFF), // HEBREW LETTER SHIN WITH SHIN DOT
  7625. (Unicode:#$FB2B; Attr:daNone; Ch1:#$05E9; Ch2:#$05C2; Ch3:#$FFFF), // HEBREW LETTER SHIN WITH SIN DOT
  7626. (Unicode:#$FB2C; Attr:daNone; Ch1:#$FB49; Ch2:#$05C1; Ch3:#$FFFF), // HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
  7627. (Unicode:#$FB2D; Attr:daNone; Ch1:#$FB49; Ch2:#$05C2; Ch3:#$FFFF), // HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
  7628. (Unicode:#$FB2E; Attr:daNone; Ch1:#$05D0; Ch2:#$05B7; Ch3:#$FFFF), // HEBREW LETTER ALEF WITH PATAH
  7629. (Unicode:#$FB2F; Attr:daNone; Ch1:#$05D0; Ch2:#$05B8; Ch3:#$FFFF), // HEBREW LETTER ALEF WITH QAMATS
  7630. (Unicode:#$FB30; Attr:daNone; Ch1:#$05D0; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER ALEF WITH MAPIQ
  7631. (Unicode:#$FB31; Attr:daNone; Ch1:#$05D1; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER BET WITH DAGESH
  7632. (Unicode:#$FB32; Attr:daNone; Ch1:#$05D2; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER GIMEL WITH DAGESH
  7633. (Unicode:#$FB33; Attr:daNone; Ch1:#$05D3; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER DALET WITH DAGESH
  7634. (Unicode:#$FB34; Attr:daNone; Ch1:#$05D4; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER HE WITH MAPIQ
  7635. (Unicode:#$FB35; Attr:daNone; Ch1:#$05D5; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER VAV WITH DAGESH
  7636. (Unicode:#$FB36; Attr:daNone; Ch1:#$05D6; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER ZAYIN WITH DAGESH
  7637. (Unicode:#$FB38; Attr:daNone; Ch1:#$05D8; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER TET WITH DAGESH
  7638. (Unicode:#$FB39; Attr:daNone; Ch1:#$05D9; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER YOD WITH DAGESH
  7639. (Unicode:#$FB3A; Attr:daNone; Ch1:#$05DA; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER FINAL KAF WITH DAGESH
  7640. (Unicode:#$FB3B; Attr:daNone; Ch1:#$05DB; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER KAF WITH DAGESH
  7641. (Unicode:#$FB3C; Attr:daNone; Ch1:#$05DC; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER LAMED WITH DAGESH
  7642. (Unicode:#$FB3E; Attr:daNone; Ch1:#$05DE; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER MEM WITH DAGESH
  7643. (Unicode:#$FB40; Attr:daNone; Ch1:#$05E0; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER NUN WITH DAGESH
  7644. (Unicode:#$FB41; Attr:daNone; Ch1:#$05E1; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER SAMEKH WITH DAGESH
  7645. (Unicode:#$FB43; Attr:daNone; Ch1:#$05E3; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER FINAL PE WITH DAGESH
  7646. (Unicode:#$FB44; Attr:daNone; Ch1:#$05E4; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER PE WITH DAGESH
  7647. (Unicode:#$FB46; Attr:daNone; Ch1:#$05E6; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER TSADI WITH DAGESH
  7648. (Unicode:#$FB47; Attr:daNone; Ch1:#$05E7; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER QOF WITH DAGESH
  7649. (Unicode:#$FB48; Attr:daNone; Ch1:#$05E8; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER RESH WITH DAGESH
  7650. (Unicode:#$FB49; Attr:daNone; Ch1:#$05E9; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER SHIN WITH DAGESH
  7651. (Unicode:#$FB4A; Attr:daNone; Ch1:#$05EA; Ch2:#$05BC; Ch3:#$FFFF), // HEBREW LETTER TAV WITH DAGESH
  7652. (Unicode:#$FB4B; Attr:daNone; Ch1:#$05D5; Ch2:#$05B9; Ch3:#$FFFF), // HEBREW LETTER VAV WITH HOLAM
  7653. (Unicode:#$FB4C; Attr:daNone; Ch1:#$05D1; Ch2:#$05BF; Ch3:#$FFFF), // HEBREW LETTER BET WITH RAFE
  7654. (Unicode:#$FB4D; Attr:daNone; Ch1:#$05DB; Ch2:#$05BF; Ch3:#$FFFF), // HEBREW LETTER KAF WITH RAFE
  7655. (Unicode:#$FB4E; Attr:daNone; Ch1:#$05E4; Ch2:#$05BF; Ch3:#$FFFF), // HEBREW LETTER PE WITH RAFE
  7656. (Unicode:#$FB4F; Attr:daCompat; Ch1:#$05D0; Ch2:#$05DC; Ch3:#$FFFF), // HEBREW LIGATURE ALEF LAMED
  7657. (Unicode:#$FB50; Attr:daIsolated; Ch1:#$0671; Ch2:#$FFFF), // ARABIC LETTER ALEF WASLA ISOLATED FORM
  7658. (Unicode:#$FB51; Attr:daFinal; Ch1:#$0671; Ch2:#$FFFF), // ARABIC LETTER ALEF WASLA FINAL FORM
  7659. (Unicode:#$FB52; Attr:daIsolated; Ch1:#$067B; Ch2:#$FFFF), // ARABIC LETTER BEEH ISOLATED FORM
  7660. (Unicode:#$FB53; Attr:daFinal; Ch1:#$067B; Ch2:#$FFFF), // ARABIC LETTER BEEH FINAL FORM
  7661. (Unicode:#$FB54; Attr:daInitial; Ch1:#$067B; Ch2:#$FFFF), // ARABIC LETTER BEEH INITIAL FORM
  7662. (Unicode:#$FB55; Attr:daMedial; Ch1:#$067B; Ch2:#$FFFF), // ARABIC LETTER BEEH MEDIAL FORM
  7663. (Unicode:#$FB56; Attr:daIsolated; Ch1:#$067E; Ch2:#$FFFF), // ARABIC LETTER PEH ISOLATED FORM
  7664. (Unicode:#$FB57; Attr:daFinal; Ch1:#$067E; Ch2:#$FFFF), // ARABIC LETTER PEH FINAL FORM
  7665. (Unicode:#$FB58; Attr:daInitial; Ch1:#$067E; Ch2:#$FFFF), // ARABIC LETTER PEH INITIAL FORM
  7666. (Unicode:#$FB59; Attr:daMedial; Ch1:#$067E; Ch2:#$FFFF), // ARABIC LETTER PEH MEDIAL FORM
  7667. (Unicode:#$FB5A; Attr:daIsolated; Ch1:#$0680; Ch2:#$FFFF), // ARABIC LETTER BEHEH ISOLATED FORM
  7668. (Unicode:#$FB5B; Attr:daFinal; Ch1:#$0680; Ch2:#$FFFF), // ARABIC LETTER BEHEH FINAL FORM
  7669. (Unicode:#$FB5C; Attr:daInitial; Ch1:#$0680; Ch2:#$FFFF), // ARABIC LETTER BEHEH INITIAL FORM
  7670. (Unicode:#$FB5D; Attr:daMedial; Ch1:#$0680; Ch2:#$FFFF), // ARABIC LETTER BEHEH MEDIAL FORM
  7671. (Unicode:#$FB5E; Attr:daIsolated; Ch1:#$067A; Ch2:#$FFFF), // ARABIC LETTER TTEHEH ISOLATED FORM
  7672. (Unicode:#$FB5F; Attr:daFinal; Ch1:#$067A; Ch2:#$FFFF), // ARABIC LETTER TTEHEH FINAL FORM
  7673. (Unicode:#$FB60; Attr:daInitial; Ch1:#$067A; Ch2:#$FFFF), // ARABIC LETTER TTEHEH INITIAL FORM
  7674. (Unicode:#$FB61; Attr:daMedial; Ch1:#$067A; Ch2:#$FFFF), // ARABIC LETTER TTEHEH MEDIAL FORM
  7675. (Unicode:#$FB62; Attr:daIsolated; Ch1:#$067F; Ch2:#$FFFF), // ARABIC LETTER TEHEH ISOLATED FORM
  7676. (Unicode:#$FB63; Attr:daFinal; Ch1:#$067F; Ch2:#$FFFF), // ARABIC LETTER TEHEH FINAL FORM
  7677. (Unicode:#$FB64; Attr:daInitial; Ch1:#$067F; Ch2:#$FFFF), // ARABIC LETTER TEHEH INITIAL FORM
  7678. (Unicode:#$FB65; Attr:daMedial; Ch1:#$067F; Ch2:#$FFFF), // ARABIC LETTER TEHEH MEDIAL FORM
  7679. (Unicode:#$FB66; Attr:daIsolated; Ch1:#$0679; Ch2:#$FFFF), // ARABIC LETTER TTEH ISOLATED FORM
  7680. (Unicode:#$FB67; Attr:daFinal; Ch1:#$0679; Ch2:#$FFFF), // ARABIC LETTER TTEH FINAL FORM
  7681. (Unicode:#$FB68; Attr:daInitial; Ch1:#$0679; Ch2:#$FFFF), // ARABIC LETTER TTEH INITIAL FORM
  7682. (Unicode:#$FB69; Attr:daMedial; Ch1:#$0679; Ch2:#$FFFF), // ARABIC LETTER TTEH MEDIAL FORM
  7683. (Unicode:#$FB6A; Attr:daIsolated; Ch1:#$06A4; Ch2:#$FFFF), // ARABIC LETTER VEH ISOLATED FORM
  7684. (Unicode:#$FB6B; Attr:daFinal; Ch1:#$06A4; Ch2:#$FFFF), // ARABIC LETTER VEH FINAL FORM
  7685. (Unicode:#$FB6C; Attr:daInitial; Ch1:#$06A4; Ch2:#$FFFF), // ARABIC LETTER VEH INITIAL FORM
  7686. (Unicode:#$FB6D; Attr:daMedial; Ch1:#$06A4; Ch2:#$FFFF), // ARABIC LETTER VEH MEDIAL FORM
  7687. (Unicode:#$FB6E; Attr:daIsolated; Ch1:#$06A6; Ch2:#$FFFF), // ARABIC LETTER PEHEH ISOLATED FORM
  7688. (Unicode:#$FB6F; Attr:daFinal; Ch1:#$06A6; Ch2:#$FFFF), // ARABIC LETTER PEHEH FINAL FORM
  7689. (Unicode:#$FB70; Attr:daInitial; Ch1:#$06A6; Ch2:#$FFFF), // ARABIC LETTER PEHEH INITIAL FORM
  7690. (Unicode:#$FB71; Attr:daMedial; Ch1:#$06A6; Ch2:#$FFFF), // ARABIC LETTER PEHEH MEDIAL FORM
  7691. (Unicode:#$FB72; Attr:daIsolated; Ch1:#$0684; Ch2:#$FFFF), // ARABIC LETTER DYEH ISOLATED FORM
  7692. (Unicode:#$FB73; Attr:daFinal; Ch1:#$0684; Ch2:#$FFFF), // ARABIC LETTER DYEH FINAL FORM
  7693. (Unicode:#$FB74; Attr:daInitial; Ch1:#$0684; Ch2:#$FFFF), // ARABIC LETTER DYEH INITIAL FORM
  7694. (Unicode:#$FB75; Attr:daMedial; Ch1:#$0684; Ch2:#$FFFF), // ARABIC LETTER DYEH MEDIAL FORM
  7695. (Unicode:#$FB76; Attr:daIsolated; Ch1:#$0683; Ch2:#$FFFF), // ARABIC LETTER NYEH ISOLATED FORM
  7696. (Unicode:#$FB77; Attr:daFinal; Ch1:#$0683; Ch2:#$FFFF), // ARABIC LETTER NYEH FINAL FORM
  7697. (Unicode:#$FB78; Attr:daInitial; Ch1:#$0683; Ch2:#$FFFF), // ARABIC LETTER NYEH INITIAL FORM
  7698. (Unicode:#$FB79; Attr:daMedial; Ch1:#$0683; Ch2:#$FFFF), // ARABIC LETTER NYEH MEDIAL FORM
  7699. (Unicode:#$FB7A; Attr:daIsolated; Ch1:#$0686; Ch2:#$FFFF), // ARABIC LETTER TCHEH ISOLATED FORM
  7700. (Unicode:#$FB7B; Attr:daFinal; Ch1:#$0686; Ch2:#$FFFF), // ARABIC LETTER TCHEH FINAL FORM
  7701. (Unicode:#$FB7C; Attr:daInitial; Ch1:#$0686; Ch2:#$FFFF), // ARABIC LETTER TCHEH INITIAL FORM
  7702. (Unicode:#$FB7D; Attr:daMedial; Ch1:#$0686; Ch2:#$FFFF), // ARABIC LETTER TCHEH MEDIAL FORM
  7703. (Unicode:#$FB7E; Attr:daIsolated; Ch1:#$0687; Ch2:#$FFFF), // ARABIC LETTER TCHEHEH ISOLATED FORM
  7704. (Unicode:#$FB7F; Attr:daFinal; Ch1:#$0687; Ch2:#$FFFF), // ARABIC LETTER TCHEHEH FINAL FORM
  7705. (Unicode:#$FB80; Attr:daInitial; Ch1:#$0687; Ch2:#$FFFF), // ARABIC LETTER TCHEHEH INITIAL FORM
  7706. (Unicode:#$FB81; Attr:daMedial; Ch1:#$0687; Ch2:#$FFFF), // ARABIC LETTER TCHEHEH MEDIAL FORM
  7707. (Unicode:#$FB82; Attr:daIsolated; Ch1:#$068D; Ch2:#$FFFF), // ARABIC LETTER DDAHAL ISOLATED FORM
  7708. (Unicode:#$FB83; Attr:daFinal; Ch1:#$068D; Ch2:#$FFFF), // ARABIC LETTER DDAHAL FINAL FORM
  7709. (Unicode:#$FB84; Attr:daIsolated; Ch1:#$068C; Ch2:#$FFFF), // ARABIC LETTER DAHAL ISOLATED FORM
  7710. (Unicode:#$FB85; Attr:daFinal; Ch1:#$068C; Ch2:#$FFFF), // ARABIC LETTER DAHAL FINAL FORM
  7711. (Unicode:#$FB86; Attr:daIsolated; Ch1:#$068E; Ch2:#$FFFF), // ARABIC LETTER DUL ISOLATED FORM
  7712. (Unicode:#$FB87; Attr:daFinal; Ch1:#$068E; Ch2:#$FFFF), // ARABIC LETTER DUL FINAL FORM
  7713. (Unicode:#$FB88; Attr:daIsolated; Ch1:#$0688; Ch2:#$FFFF), // ARABIC LETTER DDAL ISOLATED FORM
  7714. (Unicode:#$FB89; Attr:daFinal; Ch1:#$0688; Ch2:#$FFFF), // ARABIC LETTER DDAL FINAL FORM
  7715. (Unicode:#$FB8A; Attr:daIsolated; Ch1:#$0698; Ch2:#$FFFF), // ARABIC LETTER JEH ISOLATED FORM
  7716. (Unicode:#$FB8B; Attr:daFinal; Ch1:#$0698; Ch2:#$FFFF), // ARABIC LETTER JEH FINAL FORM
  7717. (Unicode:#$FB8C; Attr:daIsolated; Ch1:#$0691; Ch2:#$FFFF), // ARABIC LETTER RREH ISOLATED FORM
  7718. (Unicode:#$FB8D; Attr:daFinal; Ch1:#$0691; Ch2:#$FFFF), // ARABIC LETTER RREH FINAL FORM
  7719. (Unicode:#$FB8E; Attr:daIsolated; Ch1:#$06A9; Ch2:#$FFFF), // ARABIC LETTER KEHEH ISOLATED FORM
  7720. (Unicode:#$FB8F; Attr:daFinal; Ch1:#$06A9; Ch2:#$FFFF), // ARABIC LETTER KEHEH FINAL FORM
  7721. (Unicode:#$FB90; Attr:daInitial; Ch1:#$06A9; Ch2:#$FFFF), // ARABIC LETTER KEHEH INITIAL FORM
  7722. (Unicode:#$FB91; Attr:daMedial; Ch1:#$06A9; Ch2:#$FFFF), // ARABIC LETTER KEHEH MEDIAL FORM
  7723. (Unicode:#$FB92; Attr:daIsolated; Ch1:#$06AF; Ch2:#$FFFF), // ARABIC LETTER GAF ISOLATED FORM
  7724. (Unicode:#$FB93; Attr:daFinal; Ch1:#$06AF; Ch2:#$FFFF), // ARABIC LETTER GAF FINAL FORM
  7725. (Unicode:#$FB94; Attr:daInitial; Ch1:#$06AF; Ch2:#$FFFF), // ARABIC LETTER GAF INITIAL FORM
  7726. (Unicode:#$FB95; Attr:daMedial; Ch1:#$06AF; Ch2:#$FFFF), // ARABIC LETTER GAF MEDIAL FORM
  7727. (Unicode:#$FB96; Attr:daIsolated; Ch1:#$06B3; Ch2:#$FFFF), // ARABIC LETTER GUEH ISOLATED FORM
  7728. (Unicode:#$FB97; Attr:daFinal; Ch1:#$06B3; Ch2:#$FFFF), // ARABIC LETTER GUEH FINAL FORM
  7729. (Unicode:#$FB98; Attr:daInitial; Ch1:#$06B3; Ch2:#$FFFF), // ARABIC LETTER GUEH INITIAL FORM
  7730. (Unicode:#$FB99; Attr:daMedial; Ch1:#$06B3; Ch2:#$FFFF), // ARABIC LETTER GUEH MEDIAL FORM
  7731. (Unicode:#$FB9A; Attr:daIsolated; Ch1:#$06B1; Ch2:#$FFFF), // ARABIC LETTER NGOEH ISOLATED FORM
  7732. (Unicode:#$FB9B; Attr:daFinal; Ch1:#$06B1; Ch2:#$FFFF), // ARABIC LETTER NGOEH FINAL FORM
  7733. (Unicode:#$FB9C; Attr:daInitial; Ch1:#$06B1; Ch2:#$FFFF), // ARABIC LETTER NGOEH INITIAL FORM
  7734. (Unicode:#$FB9D; Attr:daMedial; Ch1:#$06B1; Ch2:#$FFFF), // ARABIC LETTER NGOEH MEDIAL FORM
  7735. (Unicode:#$FB9E; Attr:daIsolated; Ch1:#$06BA; Ch2:#$FFFF), // ARABIC LETTER NOON GHUNNA ISOLATED FORM
  7736. (Unicode:#$FB9F; Attr:daFinal; Ch1:#$06BA; Ch2:#$FFFF), // ARABIC LETTER NOON GHUNNA FINAL FORM
  7737. (Unicode:#$FBA0; Attr:daIsolated; Ch1:#$06BB; Ch2:#$FFFF), // ARABIC LETTER RNOON ISOLATED FORM
  7738. (Unicode:#$FBA1; Attr:daFinal; Ch1:#$06BB; Ch2:#$FFFF), // ARABIC LETTER RNOON FINAL FORM
  7739. (Unicode:#$FBA2; Attr:daInitial; Ch1:#$06BB; Ch2:#$FFFF), // ARABIC LETTER RNOON INITIAL FORM
  7740. (Unicode:#$FBA3; Attr:daMedial; Ch1:#$06BB; Ch2:#$FFFF), // ARABIC LETTER RNOON MEDIAL FORM
  7741. (Unicode:#$FBA4; Attr:daIsolated; Ch1:#$06C0; Ch2:#$FFFF), // ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
  7742. (Unicode:#$FBA5; Attr:daFinal; Ch1:#$06C0; Ch2:#$FFFF), // ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
  7743. (Unicode:#$FBA6; Attr:daIsolated; Ch1:#$06C1; Ch2:#$FFFF), // ARABIC LETTER HEH GOAL ISOLATED FORM
  7744. (Unicode:#$FBA7; Attr:daFinal; Ch1:#$06C1; Ch2:#$FFFF), // ARABIC LETTER HEH GOAL FINAL FORM
  7745. (Unicode:#$FBA8; Attr:daInitial; Ch1:#$06C1; Ch2:#$FFFF), // ARABIC LETTER HEH GOAL INITIAL FORM
  7746. (Unicode:#$FBA9; Attr:daMedial; Ch1:#$06C1; Ch2:#$FFFF), // ARABIC LETTER HEH GOAL MEDIAL FORM
  7747. (Unicode:#$FBAA; Attr:daIsolated; Ch1:#$06BE; Ch2:#$FFFF), // ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
  7748. (Unicode:#$FBAB; Attr:daFinal; Ch1:#$06BE; Ch2:#$FFFF), // ARABIC LETTER HEH DOACHASHMEE FINAL FORM
  7749. (Unicode:#$FBAC; Attr:daInitial; Ch1:#$06BE; Ch2:#$FFFF), // ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
  7750. (Unicode:#$FBAD; Attr:daMedial; Ch1:#$06BE; Ch2:#$FFFF), // ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
  7751. (Unicode:#$FBAE; Attr:daIsolated; Ch1:#$06D2; Ch2:#$FFFF), // ARABIC LETTER YEH BARREE ISOLATED FORM
  7752. (Unicode:#$FBAF; Attr:daFinal; Ch1:#$06D2; Ch2:#$FFFF), // ARABIC LETTER YEH BARREE FINAL FORM
  7753. (Unicode:#$FBB0; Attr:daIsolated; Ch1:#$06D3; Ch2:#$FFFF), // ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
  7754. (Unicode:#$FBB1; Attr:daFinal; Ch1:#$06D3; Ch2:#$FFFF), // ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
  7755. (Unicode:#$FBD3; Attr:daIsolated; Ch1:#$06AD; Ch2:#$FFFF), // ARABIC LETTER NG ISOLATED FORM
  7756. (Unicode:#$FBD4; Attr:daFinal; Ch1:#$06AD; Ch2:#$FFFF), // ARABIC LETTER NG FINAL FORM
  7757. (Unicode:#$FBD5; Attr:daInitial; Ch1:#$06AD; Ch2:#$FFFF), // ARABIC LETTER NG INITIAL FORM
  7758. (Unicode:#$FBD6; Attr:daMedial; Ch1:#$06AD; Ch2:#$FFFF), // ARABIC LETTER NG MEDIAL FORM
  7759. (Unicode:#$FBD7; Attr:daIsolated; Ch1:#$06C7; Ch2:#$FFFF), // ARABIC LETTER U ISOLATED FORM
  7760. (Unicode:#$FBD8; Attr:daFinal; Ch1:#$06C7; Ch2:#$FFFF), // ARABIC LETTER U FINAL FORM
  7761. (Unicode:#$FBD9; Attr:daIsolated; Ch1:#$06C6; Ch2:#$FFFF), // ARABIC LETTER OE ISOLATED FORM
  7762. (Unicode:#$FBDA; Attr:daFinal; Ch1:#$06C6; Ch2:#$FFFF), // ARABIC LETTER OE FINAL FORM
  7763. (Unicode:#$FBDB; Attr:daIsolated; Ch1:#$06C8; Ch2:#$FFFF), // ARABIC LETTER YU ISOLATED FORM
  7764. (Unicode:#$FBDC; Attr:daFinal; Ch1:#$06C8; Ch2:#$FFFF), // ARABIC LETTER YU FINAL FORM
  7765. (Unicode:#$FBDD; Attr:daIsolated; Ch1:#$0677; Ch2:#$FFFF), // ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM
  7766. (Unicode:#$FBDE; Attr:daIsolated; Ch1:#$06CB; Ch2:#$FFFF), // ARABIC LETTER VE ISOLATED FORM
  7767. (Unicode:#$FBDF; Attr:daFinal; Ch1:#$06CB; Ch2:#$FFFF), // ARABIC LETTER VE FINAL FORM
  7768. (Unicode:#$FBE0; Attr:daIsolated; Ch1:#$06C5; Ch2:#$FFFF), // ARABIC LETTER KIRGHIZ OE ISOLATED FORM
  7769. (Unicode:#$FBE1; Attr:daFinal; Ch1:#$06C5; Ch2:#$FFFF), // ARABIC LETTER KIRGHIZ OE FINAL FORM
  7770. (Unicode:#$FBE2; Attr:daIsolated; Ch1:#$06C9; Ch2:#$FFFF), // ARABIC LETTER KIRGHIZ YU ISOLATED FORM
  7771. (Unicode:#$FBE3; Attr:daFinal; Ch1:#$06C9; Ch2:#$FFFF), // ARABIC LETTER KIRGHIZ YU FINAL FORM
  7772. (Unicode:#$FBE4; Attr:daIsolated; Ch1:#$06D0; Ch2:#$FFFF), // ARABIC LETTER E ISOLATED FORM
  7773. (Unicode:#$FBE5; Attr:daFinal; Ch1:#$06D0; Ch2:#$FFFF), // ARABIC LETTER E FINAL FORM
  7774. (Unicode:#$FBE6; Attr:daInitial; Ch1:#$06D0; Ch2:#$FFFF), // ARABIC LETTER E INITIAL FORM
  7775. (Unicode:#$FBE7; Attr:daMedial; Ch1:#$06D0; Ch2:#$FFFF), // ARABIC LETTER E MEDIAL FORM
  7776. (Unicode:#$FBE8; Attr:daInitial; Ch1:#$0649; Ch2:#$FFFF), // ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
  7777. (Unicode:#$FBE9; Attr:daMedial; Ch1:#$0649; Ch2:#$FFFF), // ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
  7778. (Unicode:#$FBEA; Attr:daIsolated; Ch1:#$0626; Ch2:#$0627; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
  7779. (Unicode:#$FBEB; Attr:daFinal; Ch1:#$0626; Ch2:#$0627; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
  7780. (Unicode:#$FBEC; Attr:daIsolated; Ch1:#$0626; Ch2:#$06D5; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
  7781. (Unicode:#$FBED; Attr:daFinal; Ch1:#$0626; Ch2:#$06D5; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
  7782. (Unicode:#$FBEE; Attr:daIsolated; Ch1:#$0626; Ch2:#$0648; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
  7783. (Unicode:#$FBEF; Attr:daFinal; Ch1:#$0626; Ch2:#$0648; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
  7784. (Unicode:#$FBF0; Attr:daIsolated; Ch1:#$0626; Ch2:#$06C7; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
  7785. (Unicode:#$FBF1; Attr:daFinal; Ch1:#$0626; Ch2:#$06C7; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
  7786. (Unicode:#$FBF2; Attr:daIsolated; Ch1:#$0626; Ch2:#$06C6; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
  7787. (Unicode:#$FBF3; Attr:daFinal; Ch1:#$0626; Ch2:#$06C6; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
  7788. (Unicode:#$FBF4; Attr:daIsolated; Ch1:#$0626; Ch2:#$06C8; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
  7789. (Unicode:#$FBF5; Attr:daFinal; Ch1:#$0626; Ch2:#$06C8; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
  7790. (Unicode:#$FBF6; Attr:daIsolated; Ch1:#$0626; Ch2:#$06D0; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
  7791. (Unicode:#$FBF7; Attr:daFinal; Ch1:#$0626; Ch2:#$06D0; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
  7792. (Unicode:#$FBF8; Attr:daInitial; Ch1:#$0626; Ch2:#$06D0; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
  7793. (Unicode:#$FBF9; Attr:daIsolated; Ch1:#$0626; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
  7794. (Unicode:#$FBFA; Attr:daFinal; Ch1:#$0626; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
  7795. (Unicode:#$FBFB; Attr:daInitial; Ch1:#$0626; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
  7796. (Unicode:#$FBFC; Attr:daIsolated; Ch1:#$06CC; Ch2:#$FFFF), // ARABIC LETTER FARSI YEH ISOLATED FORM
  7797. (Unicode:#$FBFD; Attr:daFinal; Ch1:#$06CC; Ch2:#$FFFF), // ARABIC LETTER FARSI YEH FINAL FORM
  7798. (Unicode:#$FBFE; Attr:daInitial; Ch1:#$06CC; Ch2:#$FFFF), // ARABIC LETTER FARSI YEH INITIAL FORM
  7799. (Unicode:#$FBFF; Attr:daMedial; Ch1:#$06CC; Ch2:#$FFFF), // ARABIC LETTER FARSI YEH MEDIAL FORM
  7800. (Unicode:#$FC00; Attr:daIsolated; Ch1:#$0626; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM
  7801. (Unicode:#$FC01; Attr:daIsolated; Ch1:#$0626; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM
  7802. (Unicode:#$FC02; Attr:daIsolated; Ch1:#$0626; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM
  7803. (Unicode:#$FC03; Attr:daIsolated; Ch1:#$0626; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
  7804. (Unicode:#$FC04; Attr:daIsolated; Ch1:#$0626; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM
  7805. (Unicode:#$FC05; Attr:daIsolated; Ch1:#$0628; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM
  7806. (Unicode:#$FC06; Attr:daIsolated; Ch1:#$0628; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE BEH WITH HAH ISOLATED FORM
  7807. (Unicode:#$FC07; Attr:daIsolated; Ch1:#$0628; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM
  7808. (Unicode:#$FC08; Attr:daIsolated; Ch1:#$0628; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM
  7809. (Unicode:#$FC09; Attr:daIsolated; Ch1:#$0628; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM
  7810. (Unicode:#$FC0A; Attr:daIsolated; Ch1:#$0628; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE BEH WITH YEH ISOLATED FORM
  7811. (Unicode:#$FC0B; Attr:daIsolated; Ch1:#$062A; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM
  7812. (Unicode:#$FC0C; Attr:daIsolated; Ch1:#$062A; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE TEH WITH HAH ISOLATED FORM
  7813. (Unicode:#$FC0D; Attr:daIsolated; Ch1:#$062A; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM
  7814. (Unicode:#$FC0E; Attr:daIsolated; Ch1:#$062A; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM
  7815. (Unicode:#$FC0F; Attr:daIsolated; Ch1:#$062A; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM
  7816. (Unicode:#$FC10; Attr:daIsolated; Ch1:#$062A; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE TEH WITH YEH ISOLATED FORM
  7817. (Unicode:#$FC11; Attr:daIsolated; Ch1:#$062B; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM
  7818. (Unicode:#$FC12; Attr:daIsolated; Ch1:#$062B; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM
  7819. (Unicode:#$FC13; Attr:daIsolated; Ch1:#$062B; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM
  7820. (Unicode:#$FC14; Attr:daIsolated; Ch1:#$062B; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE THEH WITH YEH ISOLATED FORM
  7821. (Unicode:#$FC15; Attr:daIsolated; Ch1:#$062C; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM
  7822. (Unicode:#$FC16; Attr:daIsolated; Ch1:#$062C; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM
  7823. (Unicode:#$FC17; Attr:daIsolated; Ch1:#$062D; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM
  7824. (Unicode:#$FC18; Attr:daIsolated; Ch1:#$062D; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM
  7825. (Unicode:#$FC19; Attr:daIsolated; Ch1:#$062E; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM
  7826. (Unicode:#$FC1A; Attr:daIsolated; Ch1:#$062E; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM
  7827. (Unicode:#$FC1B; Attr:daIsolated; Ch1:#$062E; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM
  7828. (Unicode:#$FC1C; Attr:daIsolated; Ch1:#$0633; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM
  7829. (Unicode:#$FC1D; Attr:daIsolated; Ch1:#$0633; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM
  7830. (Unicode:#$FC1E; Attr:daIsolated; Ch1:#$0633; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM
  7831. (Unicode:#$FC1F; Attr:daIsolated; Ch1:#$0633; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM
  7832. (Unicode:#$FC20; Attr:daIsolated; Ch1:#$0635; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE SAD WITH HAH ISOLATED FORM
  7833. (Unicode:#$FC21; Attr:daIsolated; Ch1:#$0635; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM
  7834. (Unicode:#$FC22; Attr:daIsolated; Ch1:#$0636; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM
  7835. (Unicode:#$FC23; Attr:daIsolated; Ch1:#$0636; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE DAD WITH HAH ISOLATED FORM
  7836. (Unicode:#$FC24; Attr:daIsolated; Ch1:#$0636; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM
  7837. (Unicode:#$FC25; Attr:daIsolated; Ch1:#$0636; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM
  7838. (Unicode:#$FC26; Attr:daIsolated; Ch1:#$0637; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE TAH WITH HAH ISOLATED FORM
  7839. (Unicode:#$FC27; Attr:daIsolated; Ch1:#$0637; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM
  7840. (Unicode:#$FC28; Attr:daIsolated; Ch1:#$0638; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM
  7841. (Unicode:#$FC29; Attr:daIsolated; Ch1:#$0639; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM
  7842. (Unicode:#$FC2A; Attr:daIsolated; Ch1:#$0639; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM
  7843. (Unicode:#$FC2B; Attr:daIsolated; Ch1:#$063A; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM
  7844. (Unicode:#$FC2C; Attr:daIsolated; Ch1:#$063A; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM
  7845. (Unicode:#$FC2D; Attr:daIsolated; Ch1:#$0641; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM
  7846. (Unicode:#$FC2E; Attr:daIsolated; Ch1:#$0641; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE FEH WITH HAH ISOLATED FORM
  7847. (Unicode:#$FC2F; Attr:daIsolated; Ch1:#$0641; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM
  7848. (Unicode:#$FC30; Attr:daIsolated; Ch1:#$0641; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM
  7849. (Unicode:#$FC31; Attr:daIsolated; Ch1:#$0641; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM
  7850. (Unicode:#$FC32; Attr:daIsolated; Ch1:#$0641; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE FEH WITH YEH ISOLATED FORM
  7851. (Unicode:#$FC33; Attr:daIsolated; Ch1:#$0642; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE QAF WITH HAH ISOLATED FORM
  7852. (Unicode:#$FC34; Attr:daIsolated; Ch1:#$0642; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM
  7853. (Unicode:#$FC35; Attr:daIsolated; Ch1:#$0642; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM
  7854. (Unicode:#$FC36; Attr:daIsolated; Ch1:#$0642; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE QAF WITH YEH ISOLATED FORM
  7855. (Unicode:#$FC37; Attr:daIsolated; Ch1:#$0643; Ch2:#$0627; Ch3:#$FFFF),// ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM
  7856. (Unicode:#$FC38; Attr:daIsolated; Ch1:#$0643; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM
  7857. (Unicode:#$FC39; Attr:daIsolated; Ch1:#$0643; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE KAF WITH HAH ISOLATED FORM
  7858. (Unicode:#$FC3A; Attr:daIsolated; Ch1:#$0643; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM
  7859. (Unicode:#$FC3B; Attr:daIsolated; Ch1:#$0643; Ch2:#$0644; Ch3:#$FFFF),// ARABIC LIGATURE KAF WITH LAM ISOLATED FORM
  7860. (Unicode:#$FC3C; Attr:daIsolated; Ch1:#$0643; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM
  7861. (Unicode:#$FC3D; Attr:daIsolated; Ch1:#$0643; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM
  7862. (Unicode:#$FC3E; Attr:daIsolated; Ch1:#$0643; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE KAF WITH YEH ISOLATED FORM
  7863. (Unicode:#$FC3F; Attr:daIsolated; Ch1:#$0644; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM
  7864. (Unicode:#$FC40; Attr:daIsolated; Ch1:#$0644; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH HAH ISOLATED FORM
  7865. (Unicode:#$FC41; Attr:daIsolated; Ch1:#$0644; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM
  7866. (Unicode:#$FC42; Attr:daIsolated; Ch1:#$0644; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM
  7867. (Unicode:#$FC43; Attr:daIsolated; Ch1:#$0644; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM
  7868. (Unicode:#$FC44; Attr:daIsolated; Ch1:#$0644; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH YEH ISOLATED FORM
  7869. (Unicode:#$FC45; Attr:daIsolated; Ch1:#$0645; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM
  7870. (Unicode:#$FC46; Attr:daIsolated; Ch1:#$0645; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM
  7871. (Unicode:#$FC47; Attr:daIsolated; Ch1:#$0645; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM
  7872. (Unicode:#$FC48; Attr:daIsolated; Ch1:#$0645; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM
  7873. (Unicode:#$FC49; Attr:daIsolated; Ch1:#$0645; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM
  7874. (Unicode:#$FC4A; Attr:daIsolated; Ch1:#$0645; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM
  7875. (Unicode:#$FC4B; Attr:daIsolated; Ch1:#$0646; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM
  7876. (Unicode:#$FC4C; Attr:daIsolated; Ch1:#$0646; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE NOON WITH HAH ISOLATED FORM
  7877. (Unicode:#$FC4D; Attr:daIsolated; Ch1:#$0646; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM
  7878. (Unicode:#$FC4E; Attr:daIsolated; Ch1:#$0646; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM
  7879. (Unicode:#$FC4F; Attr:daIsolated; Ch1:#$0646; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM
  7880. (Unicode:#$FC50; Attr:daIsolated; Ch1:#$0646; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE NOON WITH YEH ISOLATED FORM
  7881. (Unicode:#$FC51; Attr:daIsolated; Ch1:#$0647; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM
  7882. (Unicode:#$FC52; Attr:daIsolated; Ch1:#$0647; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM
  7883. (Unicode:#$FC53; Attr:daIsolated; Ch1:#$0647; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM
  7884. (Unicode:#$FC54; Attr:daIsolated; Ch1:#$0647; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE HEH WITH YEH ISOLATED FORM
  7885. (Unicode:#$FC55; Attr:daIsolated; Ch1:#$064A; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM
  7886. (Unicode:#$FC56; Attr:daIsolated; Ch1:#$064A; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH HAH ISOLATED FORM
  7887. (Unicode:#$FC57; Attr:daIsolated; Ch1:#$064A; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM
  7888. (Unicode:#$FC58; Attr:daIsolated; Ch1:#$064A; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM
  7889. (Unicode:#$FC59; Attr:daIsolated; Ch1:#$064A; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM
  7890. (Unicode:#$FC5A; Attr:daIsolated; Ch1:#$064A; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE YEH WITH YEH ISOLATED FORM
  7891. (Unicode:#$FC5B; Attr:daIsolated; Ch1:#$0630; Ch2:#$0670; Ch3:#$FFFF),// ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM
  7892. (Unicode:#$FC5C; Attr:daIsolated; Ch1:#$0631; Ch2:#$0670; Ch3:#$FFFF),// ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM
  7893. (Unicode:#$FC5D; Attr:daIsolated; Ch1:#$0649; Ch2:#$0670; Ch3:#$FFFF),// ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM
  7894. (Unicode:#$FC5E; Attr:daIsolated; Ch1:#$0020; Ch2:#$064C; Ch3:#$0651; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
  7895. (Unicode:#$FC5F; Attr:daIsolated; Ch1:#$0020; Ch2:#$064D; Ch3:#$0651; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
  7896. (Unicode:#$FC60; Attr:daIsolated; Ch1:#$0020; Ch2:#$064E; Ch3:#$0651; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM
  7897. (Unicode:#$FC61; Attr:daIsolated; Ch1:#$0020; Ch2:#$064F; Ch3:#$0651; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM
  7898. (Unicode:#$FC62; Attr:daIsolated; Ch1:#$0020; Ch2:#$0650; Ch3:#$0651; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM
  7899. (Unicode:#$FC63; Attr:daIsolated; Ch1:#$0020; Ch2:#$0651; Ch3:#$0670; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
  7900. (Unicode:#$FC64; Attr:daFinal; Ch1:#$0626; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM
  7901. (Unicode:#$FC65; Attr:daFinal; Ch1:#$0626; Ch2:#$0632; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM
  7902. (Unicode:#$FC66; Attr:daFinal; Ch1:#$0626; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM
  7903. (Unicode:#$FC67; Attr:daFinal; Ch1:#$0626; Ch2:#$0646; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM
  7904. (Unicode:#$FC68; Attr:daFinal; Ch1:#$0626; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
  7905. (Unicode:#$FC69; Attr:daFinal; Ch1:#$0626; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM
  7906. (Unicode:#$FC6A; Attr:daFinal; Ch1:#$0628; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH REH FINAL FORM
  7907. (Unicode:#$FC6B; Attr:daFinal; Ch1:#$0628; Ch2:#$0632; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH ZAIN FINAL FORM
  7908. (Unicode:#$FC6C; Attr:daFinal; Ch1:#$0628; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH MEEM FINAL FORM
  7909. (Unicode:#$FC6D; Attr:daFinal; Ch1:#$0628; Ch2:#$0646; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH NOON FINAL FORM
  7910. (Unicode:#$FC6E; Attr:daFinal; Ch1:#$0628; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM
  7911. (Unicode:#$FC6F; Attr:daFinal; Ch1:#$0628; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH YEH FINAL FORM
  7912. (Unicode:#$FC70; Attr:daFinal; Ch1:#$062A; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH REH FINAL FORM
  7913. (Unicode:#$FC71; Attr:daFinal; Ch1:#$062A; Ch2:#$0632; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH ZAIN FINAL FORM
  7914. (Unicode:#$FC72; Attr:daFinal; Ch1:#$062A; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH MEEM FINAL FORM
  7915. (Unicode:#$FC73; Attr:daFinal; Ch1:#$062A; Ch2:#$0646; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH NOON FINAL FORM
  7916. (Unicode:#$FC74; Attr:daFinal; Ch1:#$062A; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM
  7917. (Unicode:#$FC75; Attr:daFinal; Ch1:#$062A; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH YEH FINAL FORM
  7918. (Unicode:#$FC76; Attr:daFinal; Ch1:#$062B; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH REH FINAL FORM
  7919. (Unicode:#$FC77; Attr:daFinal; Ch1:#$062B; Ch2:#$0632; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH ZAIN FINAL FORM
  7920. (Unicode:#$FC78; Attr:daFinal; Ch1:#$062B; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH MEEM FINAL FORM
  7921. (Unicode:#$FC79; Attr:daFinal; Ch1:#$062B; Ch2:#$0646; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH NOON FINAL FORM
  7922. (Unicode:#$FC7A; Attr:daFinal; Ch1:#$062B; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM
  7923. (Unicode:#$FC7B; Attr:daFinal; Ch1:#$062B; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH YEH FINAL FORM
  7924. (Unicode:#$FC7C; Attr:daFinal; Ch1:#$0641; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM
  7925. (Unicode:#$FC7D; Attr:daFinal; Ch1:#$0641; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE FEH WITH YEH FINAL FORM
  7926. (Unicode:#$FC7E; Attr:daFinal; Ch1:#$0642; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM
  7927. (Unicode:#$FC7F; Attr:daFinal; Ch1:#$0642; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE QAF WITH YEH FINAL FORM
  7928. (Unicode:#$FC80; Attr:daFinal; Ch1:#$0643; Ch2:#$0627; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH ALEF FINAL FORM
  7929. (Unicode:#$FC81; Attr:daFinal; Ch1:#$0643; Ch2:#$0644; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH LAM FINAL FORM
  7930. (Unicode:#$FC82; Attr:daFinal; Ch1:#$0643; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH MEEM FINAL FORM
  7931. (Unicode:#$FC83; Attr:daFinal; Ch1:#$0643; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM
  7932. (Unicode:#$FC84; Attr:daFinal; Ch1:#$0643; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH YEH FINAL FORM
  7933. (Unicode:#$FC85; Attr:daFinal; Ch1:#$0644; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH MEEM FINAL FORM
  7934. (Unicode:#$FC86; Attr:daFinal; Ch1:#$0644; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM
  7935. (Unicode:#$FC87; Attr:daFinal; Ch1:#$0644; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH YEH FINAL FORM
  7936. (Unicode:#$FC88; Attr:daFinal; Ch1:#$0645; Ch2:#$0627; Ch3:#$FFFF), // ARABIC LIGATURE MEEM WITH ALEF FINAL FORM
  7937. (Unicode:#$FC89; Attr:daFinal; Ch1:#$0645; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE MEEM WITH MEEM FINAL FORM
  7938. (Unicode:#$FC8A; Attr:daFinal; Ch1:#$0646; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH REH FINAL FORM
  7939. (Unicode:#$FC8B; Attr:daFinal; Ch1:#$0646; Ch2:#$0632; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH ZAIN FINAL FORM
  7940. (Unicode:#$FC8C; Attr:daFinal; Ch1:#$0646; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH MEEM FINAL FORM
  7941. (Unicode:#$FC8D; Attr:daFinal; Ch1:#$0646; Ch2:#$0646; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH NOON FINAL FORM
  7942. (Unicode:#$FC8E; Attr:daFinal; Ch1:#$0646; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM
  7943. (Unicode:#$FC8F; Attr:daFinal; Ch1:#$0646; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH YEH FINAL FORM
  7944. (Unicode:#$FC90; Attr:daFinal; Ch1:#$0649; Ch2:#$0670; Ch3:#$FFFF), // ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM
  7945. (Unicode:#$FC91; Attr:daFinal; Ch1:#$064A; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH REH FINAL FORM
  7946. (Unicode:#$FC92; Attr:daFinal; Ch1:#$064A; Ch2:#$0632; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH ZAIN FINAL FORM
  7947. (Unicode:#$FC93; Attr:daFinal; Ch1:#$064A; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH MEEM FINAL FORM
  7948. (Unicode:#$FC94; Attr:daFinal; Ch1:#$064A; Ch2:#$0646; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH NOON FINAL FORM
  7949. (Unicode:#$FC95; Attr:daFinal; Ch1:#$064A; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM
  7950. (Unicode:#$FC96; Attr:daFinal; Ch1:#$064A; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH YEH FINAL FORM
  7951. (Unicode:#$FC97; Attr:daInitial; Ch1:#$0626; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM
  7952. (Unicode:#$FC98; Attr:daInitial; Ch1:#$0626; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM
  7953. (Unicode:#$FC99; Attr:daInitial; Ch1:#$0626; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM
  7954. (Unicode:#$FC9A; Attr:daInitial; Ch1:#$0626; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM
  7955. (Unicode:#$FC9B; Attr:daInitial; Ch1:#$0626; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM
  7956. (Unicode:#$FC9C; Attr:daInitial; Ch1:#$0628; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH JEEM INITIAL FORM
  7957. (Unicode:#$FC9D; Attr:daInitial; Ch1:#$0628; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH HAH INITIAL FORM
  7958. (Unicode:#$FC9E; Attr:daInitial; Ch1:#$0628; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH KHAH INITIAL FORM
  7959. (Unicode:#$FC9F; Attr:daInitial; Ch1:#$0628; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH MEEM INITIAL FORM
  7960. (Unicode:#$FCA0; Attr:daInitial; Ch1:#$0628; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH HEH INITIAL FORM
  7961. (Unicode:#$FCA1; Attr:daInitial; Ch1:#$062A; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH JEEM INITIAL FORM
  7962. (Unicode:#$FCA2; Attr:daInitial; Ch1:#$062A; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH HAH INITIAL FORM
  7963. (Unicode:#$FCA3; Attr:daInitial; Ch1:#$062A; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH KHAH INITIAL FORM
  7964. (Unicode:#$FCA4; Attr:daInitial; Ch1:#$062A; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH MEEM INITIAL FORM
  7965. (Unicode:#$FCA5; Attr:daInitial; Ch1:#$062A; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH HEH INITIAL FORM
  7966. (Unicode:#$FCA6; Attr:daInitial; Ch1:#$062B; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH MEEM INITIAL FORM
  7967. (Unicode:#$FCA7; Attr:daInitial; Ch1:#$062C; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE JEEM WITH HAH INITIAL FORM
  7968. (Unicode:#$FCA8; Attr:daInitial; Ch1:#$062C; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM
  7969. (Unicode:#$FCA9; Attr:daInitial; Ch1:#$062D; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE HAH WITH JEEM INITIAL FORM
  7970. (Unicode:#$FCAA; Attr:daInitial; Ch1:#$062D; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE HAH WITH MEEM INITIAL FORM
  7971. (Unicode:#$FCAB; Attr:daInitial; Ch1:#$062E; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM
  7972. (Unicode:#$FCAC; Attr:daInitial; Ch1:#$062E; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM
  7973. (Unicode:#$FCAD; Attr:daInitial; Ch1:#$0633; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM
  7974. (Unicode:#$FCAE; Attr:daInitial; Ch1:#$0633; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH HAH INITIAL FORM
  7975. (Unicode:#$FCAF; Attr:daInitial; Ch1:#$0633; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM
  7976. (Unicode:#$FCB0; Attr:daInitial; Ch1:#$0633; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM
  7977. (Unicode:#$FCB1; Attr:daInitial; Ch1:#$0635; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE SAD WITH HAH INITIAL FORM
  7978. (Unicode:#$FCB2; Attr:daInitial; Ch1:#$0635; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE SAD WITH KHAH INITIAL FORM
  7979. (Unicode:#$FCB3; Attr:daInitial; Ch1:#$0635; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE SAD WITH MEEM INITIAL FORM
  7980. (Unicode:#$FCB4; Attr:daInitial; Ch1:#$0636; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE DAD WITH JEEM INITIAL FORM
  7981. (Unicode:#$FCB5; Attr:daInitial; Ch1:#$0636; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE DAD WITH HAH INITIAL FORM
  7982. (Unicode:#$FCB6; Attr:daInitial; Ch1:#$0636; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE DAD WITH KHAH INITIAL FORM
  7983. (Unicode:#$FCB7; Attr:daInitial; Ch1:#$0636; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE DAD WITH MEEM INITIAL FORM
  7984. (Unicode:#$FCB8; Attr:daInitial; Ch1:#$0637; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE TAH WITH HAH INITIAL FORM
  7985. (Unicode:#$FCB9; Attr:daInitial; Ch1:#$0638; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM
  7986. (Unicode:#$FCBA; Attr:daInitial; Ch1:#$0639; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE AIN WITH JEEM INITIAL FORM
  7987. (Unicode:#$FCBB; Attr:daInitial; Ch1:#$0639; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE AIN WITH MEEM INITIAL FORM
  7988. (Unicode:#$FCBC; Attr:daInitial; Ch1:#$063A; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM
  7989. (Unicode:#$FCBD; Attr:daInitial; Ch1:#$063A; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM
  7990. (Unicode:#$FCBE; Attr:daInitial; Ch1:#$0641; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE FEH WITH JEEM INITIAL FORM
  7991. (Unicode:#$FCBF; Attr:daInitial; Ch1:#$0641; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE FEH WITH HAH INITIAL FORM
  7992. (Unicode:#$FCC0; Attr:daInitial; Ch1:#$0641; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE FEH WITH KHAH INITIAL FORM
  7993. (Unicode:#$FCC1; Attr:daInitial; Ch1:#$0641; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE FEH WITH MEEM INITIAL FORM
  7994. (Unicode:#$FCC2; Attr:daInitial; Ch1:#$0642; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE QAF WITH HAH INITIAL FORM
  7995. (Unicode:#$FCC3; Attr:daInitial; Ch1:#$0642; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE QAF WITH MEEM INITIAL FORM
  7996. (Unicode:#$FCC4; Attr:daInitial; Ch1:#$0643; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH JEEM INITIAL FORM
  7997. (Unicode:#$FCC5; Attr:daInitial; Ch1:#$0643; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH HAH INITIAL FORM
  7998. (Unicode:#$FCC6; Attr:daInitial; Ch1:#$0643; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH KHAH INITIAL FORM
  7999. (Unicode:#$FCC7; Attr:daInitial; Ch1:#$0643; Ch2:#$0644; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH LAM INITIAL FORM
  8000. (Unicode:#$FCC8; Attr:daInitial; Ch1:#$0643; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH MEEM INITIAL FORM
  8001. (Unicode:#$FCC9; Attr:daInitial; Ch1:#$0644; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH JEEM INITIAL FORM
  8002. (Unicode:#$FCCA; Attr:daInitial; Ch1:#$0644; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH HAH INITIAL FORM
  8003. (Unicode:#$FCCB; Attr:daInitial; Ch1:#$0644; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH KHAH INITIAL FORM
  8004. (Unicode:#$FCCC; Attr:daInitial; Ch1:#$0644; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH MEEM INITIAL FORM
  8005. (Unicode:#$FCCD; Attr:daInitial; Ch1:#$0644; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH HEH INITIAL FORM
  8006. (Unicode:#$FCCE; Attr:daInitial; Ch1:#$0645; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM
  8007. (Unicode:#$FCCF; Attr:daInitial; Ch1:#$0645; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE MEEM WITH HAH INITIAL FORM
  8008. (Unicode:#$FCD0; Attr:daInitial; Ch1:#$0645; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM
  8009. (Unicode:#$FCD1; Attr:daInitial; Ch1:#$0645; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM
  8010. (Unicode:#$FCD2; Attr:daInitial; Ch1:#$0646; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH JEEM INITIAL FORM
  8011. (Unicode:#$FCD3; Attr:daInitial; Ch1:#$0646; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH HAH INITIAL FORM
  8012. (Unicode:#$FCD4; Attr:daInitial; Ch1:#$0646; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH KHAH INITIAL FORM
  8013. (Unicode:#$FCD5; Attr:daInitial; Ch1:#$0646; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH MEEM INITIAL FORM
  8014. (Unicode:#$FCD6; Attr:daInitial; Ch1:#$0646; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH HEH INITIAL FORM
  8015. (Unicode:#$FCD7; Attr:daInitial; Ch1:#$0647; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE HEH WITH JEEM INITIAL FORM
  8016. (Unicode:#$FCD8; Attr:daInitial; Ch1:#$0647; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE HEH WITH MEEM INITIAL FORM
  8017. (Unicode:#$FCD9; Attr:daInitial; Ch1:#$0647; Ch2:#$0670; Ch3:#$FFFF), // ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM
  8018. (Unicode:#$FCDA; Attr:daInitial; Ch1:#$064A; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH JEEM INITIAL FORM
  8019. (Unicode:#$FCDB; Attr:daInitial; Ch1:#$064A; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAH INITIAL FORM
  8020. (Unicode:#$FCDC; Attr:daInitial; Ch1:#$064A; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH KHAH INITIAL FORM
  8021. (Unicode:#$FCDD; Attr:daInitial; Ch1:#$064A; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH MEEM INITIAL FORM
  8022. (Unicode:#$FCDE; Attr:daInitial; Ch1:#$064A; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HEH INITIAL FORM
  8023. (Unicode:#$FCDF; Attr:daMedial; Ch1:#$0626; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM
  8024. (Unicode:#$FCE0; Attr:daMedial; Ch1:#$0626; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM
  8025. (Unicode:#$FCE1; Attr:daMedial; Ch1:#$0628; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM
  8026. (Unicode:#$FCE2; Attr:daMedial; Ch1:#$0628; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE BEH WITH HEH MEDIAL FORM
  8027. (Unicode:#$FCE3; Attr:daMedial; Ch1:#$062A; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM
  8028. (Unicode:#$FCE4; Attr:daMedial; Ch1:#$062A; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE TEH WITH HEH MEDIAL FORM
  8029. (Unicode:#$FCE5; Attr:daMedial; Ch1:#$062B; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM
  8030. (Unicode:#$FCE6; Attr:daMedial; Ch1:#$062B; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE THEH WITH HEH MEDIAL FORM
  8031. (Unicode:#$FCE7; Attr:daMedial; Ch1:#$0633; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM
  8032. (Unicode:#$FCE8; Attr:daMedial; Ch1:#$0633; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM
  8033. (Unicode:#$FCE9; Attr:daMedial; Ch1:#$0634; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM
  8034. (Unicode:#$FCEA; Attr:daMedial; Ch1:#$0634; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM
  8035. (Unicode:#$FCEB; Attr:daMedial; Ch1:#$0643; Ch2:#$0644; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH LAM MEDIAL FORM
  8036. (Unicode:#$FCEC; Attr:daMedial; Ch1:#$0643; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM
  8037. (Unicode:#$FCED; Attr:daMedial; Ch1:#$0644; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM
  8038. (Unicode:#$FCEE; Attr:daMedial; Ch1:#$0646; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM
  8039. (Unicode:#$FCEF; Attr:daMedial; Ch1:#$0646; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE NOON WITH HEH MEDIAL FORM
  8040. (Unicode:#$FCF0; Attr:daMedial; Ch1:#$064A; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM
  8041. (Unicode:#$FCF1; Attr:daMedial; Ch1:#$064A; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE YEH WITH HEH MEDIAL FORM
  8042. (Unicode:#$FCF2; Attr:daMedial; Ch1:#$0640; Ch2:#$064E; Ch3:#$0651; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM
  8043. (Unicode:#$FCF3; Attr:daMedial; Ch1:#$0640; Ch2:#$064F; Ch3:#$0651; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM
  8044. (Unicode:#$FCF4; Attr:daMedial; Ch1:#$0640; Ch2:#$0650; Ch3:#$0651; Ch4:#$FFFF), // ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
  8045. (Unicode:#$FCF5; Attr:daIsolated; Ch1:#$0637; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM
  8046. (Unicode:#$FCF6; Attr:daIsolated; Ch1:#$0637; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE TAH WITH YEH ISOLATED FORM
  8047. (Unicode:#$FCF7; Attr:daIsolated; Ch1:#$0639; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM
  8048. (Unicode:#$FCF8; Attr:daIsolated; Ch1:#$0639; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE AIN WITH YEH ISOLATED FORM
  8049. (Unicode:#$FCF9; Attr:daIsolated; Ch1:#$063A; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM
  8050. (Unicode:#$FCFA; Attr:daIsolated; Ch1:#$063A; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM
  8051. (Unicode:#$FCFB; Attr:daIsolated; Ch1:#$0633; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM
  8052. (Unicode:#$FCFC; Attr:daIsolated; Ch1:#$0633; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM
  8053. (Unicode:#$FCFD; Attr:daIsolated; Ch1:#$0634; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM
  8054. (Unicode:#$FCFE; Attr:daIsolated; Ch1:#$0634; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM
  8055. (Unicode:#$FCFF; Attr:daIsolated; Ch1:#$062D; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM
  8056. (Unicode:#$FD00; Attr:daIsolated; Ch1:#$062D; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE HAH WITH YEH ISOLATED FORM
  8057. (Unicode:#$FD01; Attr:daIsolated; Ch1:#$062C; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM
  8058. (Unicode:#$FD02; Attr:daIsolated; Ch1:#$062C; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM
  8059. (Unicode:#$FD03; Attr:daIsolated; Ch1:#$062E; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM
  8060. (Unicode:#$FD04; Attr:daIsolated; Ch1:#$062E; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM
  8061. (Unicode:#$FD05; Attr:daIsolated; Ch1:#$0635; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM
  8062. (Unicode:#$FD06; Attr:daIsolated; Ch1:#$0635; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE SAD WITH YEH ISOLATED FORM
  8063. (Unicode:#$FD07; Attr:daIsolated; Ch1:#$0636; Ch2:#$0649; Ch3:#$FFFF),// ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM
  8064. (Unicode:#$FD08; Attr:daIsolated; Ch1:#$0636; Ch2:#$064A; Ch3:#$FFFF),// ARABIC LIGATURE DAD WITH YEH ISOLATED FORM
  8065. (Unicode:#$FD09; Attr:daIsolated; Ch1:#$0634; Ch2:#$062C; Ch3:#$FFFF),// ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM
  8066. (Unicode:#$FD0A; Attr:daIsolated; Ch1:#$0634; Ch2:#$062D; Ch3:#$FFFF),// ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM
  8067. (Unicode:#$FD0B; Attr:daIsolated; Ch1:#$0634; Ch2:#$062E; Ch3:#$FFFF),// ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM
  8068. (Unicode:#$FD0C; Attr:daIsolated; Ch1:#$0634; Ch2:#$0645; Ch3:#$FFFF),// ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM
  8069. (Unicode:#$FD0D; Attr:daIsolated; Ch1:#$0634; Ch2:#$0631; Ch3:#$FFFF),// ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM
  8070. (Unicode:#$FD0E; Attr:daIsolated; Ch1:#$0633; Ch2:#$0631; Ch3:#$FFFF),// ARABIC LIGATURE SEEN WITH REH ISOLATED FORM
  8071. (Unicode:#$FD0F; Attr:daIsolated; Ch1:#$0635; Ch2:#$0631; Ch3:#$FFFF),// ARABIC LIGATURE SAD WITH REH ISOLATED FORM
  8072. (Unicode:#$FD10; Attr:daIsolated; Ch1:#$0636; Ch2:#$0631; Ch3:#$FFFF),// ARABIC LIGATURE DAD WITH REH ISOLATED FORM
  8073. (Unicode:#$FD11; Attr:daFinal; Ch1:#$0637; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM
  8074. (Unicode:#$FD12; Attr:daFinal; Ch1:#$0637; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE TAH WITH YEH FINAL FORM
  8075. (Unicode:#$FD13; Attr:daFinal; Ch1:#$0639; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM
  8076. (Unicode:#$FD14; Attr:daFinal; Ch1:#$0639; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE AIN WITH YEH FINAL FORM
  8077. (Unicode:#$FD15; Attr:daFinal; Ch1:#$063A; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM
  8078. (Unicode:#$FD16; Attr:daFinal; Ch1:#$063A; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE GHAIN WITH YEH FINAL FORM
  8079. (Unicode:#$FD17; Attr:daFinal; Ch1:#$0633; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM
  8080. (Unicode:#$FD18; Attr:daFinal; Ch1:#$0633; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH YEH FINAL FORM
  8081. (Unicode:#$FD19; Attr:daFinal; Ch1:#$0634; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM
  8082. (Unicode:#$FD1A; Attr:daFinal; Ch1:#$0634; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH YEH FINAL FORM
  8083. (Unicode:#$FD1B; Attr:daFinal; Ch1:#$062D; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM
  8084. (Unicode:#$FD1C; Attr:daFinal; Ch1:#$062D; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE HAH WITH YEH FINAL FORM
  8085. (Unicode:#$FD1D; Attr:daFinal; Ch1:#$062C; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM
  8086. (Unicode:#$FD1E; Attr:daFinal; Ch1:#$062C; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE JEEM WITH YEH FINAL FORM
  8087. (Unicode:#$FD1F; Attr:daFinal; Ch1:#$062E; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM
  8088. (Unicode:#$FD20; Attr:daFinal; Ch1:#$062E; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE KHAH WITH YEH FINAL FORM
  8089. (Unicode:#$FD21; Attr:daFinal; Ch1:#$0635; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM
  8090. (Unicode:#$FD22; Attr:daFinal; Ch1:#$0635; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE SAD WITH YEH FINAL FORM
  8091. (Unicode:#$FD23; Attr:daFinal; Ch1:#$0636; Ch2:#$0649; Ch3:#$FFFF), // ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM
  8092. (Unicode:#$FD24; Attr:daFinal; Ch1:#$0636; Ch2:#$064A; Ch3:#$FFFF), // ARABIC LIGATURE DAD WITH YEH FINAL FORM
  8093. (Unicode:#$FD25; Attr:daFinal; Ch1:#$0634; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM
  8094. (Unicode:#$FD26; Attr:daFinal; Ch1:#$0634; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH HAH FINAL FORM
  8095. (Unicode:#$FD27; Attr:daFinal; Ch1:#$0634; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM
  8096. (Unicode:#$FD28; Attr:daFinal; Ch1:#$0634; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM
  8097. (Unicode:#$FD29; Attr:daFinal; Ch1:#$0634; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH REH FINAL FORM
  8098. (Unicode:#$FD2A; Attr:daFinal; Ch1:#$0633; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH REH FINAL FORM
  8099. (Unicode:#$FD2B; Attr:daFinal; Ch1:#$0635; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE SAD WITH REH FINAL FORM
  8100. (Unicode:#$FD2C; Attr:daFinal; Ch1:#$0636; Ch2:#$0631; Ch3:#$FFFF), // ARABIC LIGATURE DAD WITH REH FINAL FORM
  8101. (Unicode:#$FD2D; Attr:daInitial; Ch1:#$0634; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM
  8102. (Unicode:#$FD2E; Attr:daInitial; Ch1:#$0634; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM
  8103. (Unicode:#$FD2F; Attr:daInitial; Ch1:#$0634; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM
  8104. (Unicode:#$FD30; Attr:daInitial; Ch1:#$0634; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM
  8105. (Unicode:#$FD31; Attr:daInitial; Ch1:#$0633; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH HEH INITIAL FORM
  8106. (Unicode:#$FD32; Attr:daInitial; Ch1:#$0634; Ch2:#$0647; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM
  8107. (Unicode:#$FD33; Attr:daInitial; Ch1:#$0637; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
  8108. (Unicode:#$FD34; Attr:daMedial; Ch1:#$0633; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM
  8109. (Unicode:#$FD35; Attr:daMedial; Ch1:#$0633; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM
  8110. (Unicode:#$FD36; Attr:daMedial; Ch1:#$0633; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM
  8111. (Unicode:#$FD37; Attr:daMedial; Ch1:#$0634; Ch2:#$062C; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM
  8112. (Unicode:#$FD38; Attr:daMedial; Ch1:#$0634; Ch2:#$062D; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM
  8113. (Unicode:#$FD39; Attr:daMedial; Ch1:#$0634; Ch2:#$062E; Ch3:#$FFFF), // ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM
  8114. (Unicode:#$FD3A; Attr:daMedial; Ch1:#$0637; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM
  8115. (Unicode:#$FD3B; Attr:daMedial; Ch1:#$0638; Ch2:#$0645; Ch3:#$FFFF), // ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
  8116. (Unicode:#$FD3C; Attr:daFinal; Ch1:#$0627; Ch2:#$064B; Ch3:#$FFFF), // ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
  8117. (Unicode:#$FD3D; Attr:daIsolated; Ch1:#$0627; Ch2:#$064B; Ch3:#$FFFF),// ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
  8118. (Unicode:#$FD50; Attr:daInitial; Ch1:#$062A; Ch2:#$062C; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
  8119. (Unicode:#$FD51; Attr:daFinal; Ch1:#$062A; Ch2:#$062D; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
  8120. (Unicode:#$FD52; Attr:daInitial; Ch1:#$062A; Ch2:#$062D; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM
  8121. (Unicode:#$FD53; Attr:daInitial; Ch1:#$062A; Ch2:#$062D; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM
  8122. (Unicode:#$FD54; Attr:daInitial; Ch1:#$062A; Ch2:#$062E; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM
  8123. (Unicode:#$FD55; Attr:daInitial; Ch1:#$062A; Ch2:#$0645; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM
  8124. (Unicode:#$FD56; Attr:daInitial; Ch1:#$062A; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM
  8125. (Unicode:#$FD57; Attr:daInitial; Ch1:#$062A; Ch2:#$0645; Ch3:#$062E; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
  8126. (Unicode:#$FD58; Attr:daFinal; Ch1:#$062C; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
  8127. (Unicode:#$FD59; Attr:daInitial; Ch1:#$062C; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
  8128. (Unicode:#$FD5A; Attr:daFinal; Ch1:#$062D; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM
  8129. (Unicode:#$FD5B; Attr:daFinal; Ch1:#$062D; Ch2:#$0645; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
  8130. (Unicode:#$FD5C; Attr:daInitial; Ch1:#$0633; Ch2:#$062D; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM
  8131. (Unicode:#$FD5D; Attr:daInitial; Ch1:#$0633; Ch2:#$062C; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
  8132. (Unicode:#$FD5E; Attr:daFinal; Ch1:#$0633; Ch2:#$062C; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM
  8133. (Unicode:#$FD5F; Attr:daFinal; Ch1:#$0633; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
  8134. (Unicode:#$FD60; Attr:daInitial; Ch1:#$0633; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM
  8135. (Unicode:#$FD61; Attr:daInitial; Ch1:#$0633; Ch2:#$0645; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
  8136. (Unicode:#$FD62; Attr:daFinal; Ch1:#$0633; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
  8137. (Unicode:#$FD63; Attr:daInitial; Ch1:#$0633; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
  8138. (Unicode:#$FD64; Attr:daFinal; Ch1:#$0635; Ch2:#$062D; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
  8139. (Unicode:#$FD65; Attr:daInitial; Ch1:#$0635; Ch2:#$062D; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
  8140. (Unicode:#$FD66; Attr:daFinal; Ch1:#$0635; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM
  8141. (Unicode:#$FD67; Attr:daFinal; Ch1:#$0634; Ch2:#$062D; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
  8142. (Unicode:#$FD68; Attr:daInitial; Ch1:#$0634; Ch2:#$062D; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
  8143. (Unicode:#$FD69; Attr:daFinal; Ch1:#$0634; Ch2:#$062C; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM
  8144. (Unicode:#$FD6A; Attr:daFinal; Ch1:#$0634; Ch2:#$0645; Ch3:#$062E; Ch4:#$FFFF), // ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
  8145. (Unicode:#$FD6B; Attr:daInitial; Ch1:#$0634; Ch2:#$0645; Ch3:#$062E; Ch4:#$FFFF), // ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
  8146. (Unicode:#$FD6C; Attr:daFinal; Ch1:#$0634; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
  8147. (Unicode:#$FD6D; Attr:daInitial; Ch1:#$0634; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
  8148. (Unicode:#$FD6E; Attr:daFinal; Ch1:#$0636; Ch2:#$062D; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM
  8149. (Unicode:#$FD6F; Attr:daFinal; Ch1:#$0636; Ch2:#$062E; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
  8150. (Unicode:#$FD70; Attr:daInitial; Ch1:#$0636; Ch2:#$062E; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
  8151. (Unicode:#$FD71; Attr:daFinal; Ch1:#$0637; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
  8152. (Unicode:#$FD72; Attr:daInitial; Ch1:#$0637; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM
  8153. (Unicode:#$FD73; Attr:daInitial; Ch1:#$0637; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
  8154. (Unicode:#$FD74; Attr:daFinal; Ch1:#$0637; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM
  8155. (Unicode:#$FD75; Attr:daFinal; Ch1:#$0639; Ch2:#$062C; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM
  8156. (Unicode:#$FD76; Attr:daFinal; Ch1:#$0639; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
  8157. (Unicode:#$FD77; Attr:daInitial; Ch1:#$0639; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
  8158. (Unicode:#$FD78; Attr:daFinal; Ch1:#$0639; Ch2:#$0645; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
  8159. (Unicode:#$FD79; Attr:daFinal; Ch1:#$063A; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM
  8160. (Unicode:#$FD7A; Attr:daFinal; Ch1:#$063A; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM
  8161. (Unicode:#$FD7B; Attr:daFinal; Ch1:#$063A; Ch2:#$0645; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM
  8162. (Unicode:#$FD7C; Attr:daFinal; Ch1:#$0641; Ch2:#$062E; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
  8163. (Unicode:#$FD7D; Attr:daInitial; Ch1:#$0641; Ch2:#$062E; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
  8164. (Unicode:#$FD7E; Attr:daFinal; Ch1:#$0642; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM
  8165. (Unicode:#$FD7F; Attr:daFinal; Ch1:#$0642; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM
  8166. (Unicode:#$FD80; Attr:daFinal; Ch1:#$0644; Ch2:#$062D; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM
  8167. (Unicode:#$FD81; Attr:daFinal; Ch1:#$0644; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM
  8168. (Unicode:#$FD82; Attr:daFinal; Ch1:#$0644; Ch2:#$062D; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
  8169. (Unicode:#$FD83; Attr:daInitial; Ch1:#$0644; Ch2:#$062C; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
  8170. (Unicode:#$FD84; Attr:daFinal; Ch1:#$0644; Ch2:#$062C; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM
  8171. (Unicode:#$FD85; Attr:daFinal; Ch1:#$0644; Ch2:#$062E; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
  8172. (Unicode:#$FD86; Attr:daInitial; Ch1:#$0644; Ch2:#$062E; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
  8173. (Unicode:#$FD87; Attr:daFinal; Ch1:#$0644; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
  8174. (Unicode:#$FD88; Attr:daInitial; Ch1:#$0644; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM
  8175. (Unicode:#$FD89; Attr:daInitial; Ch1:#$0645; Ch2:#$062D; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM
  8176. (Unicode:#$FD8A; Attr:daInitial; Ch1:#$0645; Ch2:#$062D; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
  8177. (Unicode:#$FD8B; Attr:daFinal; Ch1:#$0645; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
  8178. (Unicode:#$FD8C; Attr:daInitial; Ch1:#$0645; Ch2:#$062C; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM
  8179. (Unicode:#$FD8D; Attr:daInitial; Ch1:#$0645; Ch2:#$062C; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM
  8180. (Unicode:#$FD8E; Attr:daInitial; Ch1:#$0645; Ch2:#$062E; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM
  8181. (Unicode:#$FD8F; Attr:daInitial; Ch1:#$0645; Ch2:#$062E; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
  8182. (Unicode:#$FD92; Attr:daInitial; Ch1:#$0645; Ch2:#$062C; Ch3:#$062E; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
  8183. (Unicode:#$FD93; Attr:daInitial; Ch1:#$0647; Ch2:#$0645; Ch3:#$062C; Ch4:#$FFFF), // ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM
  8184. (Unicode:#$FD94; Attr:daInitial; Ch1:#$0647; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM
  8185. (Unicode:#$FD95; Attr:daInitial; Ch1:#$0646; Ch2:#$062D; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
  8186. (Unicode:#$FD96; Attr:daFinal; Ch1:#$0646; Ch2:#$062D; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM
  8187. (Unicode:#$FD97; Attr:daFinal; Ch1:#$0646; Ch2:#$062C; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
  8188. (Unicode:#$FD98; Attr:daInitial; Ch1:#$0646; Ch2:#$062C; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
  8189. (Unicode:#$FD99; Attr:daFinal; Ch1:#$0646; Ch2:#$062C; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM
  8190. (Unicode:#$FD9A; Attr:daFinal; Ch1:#$0646; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM
  8191. (Unicode:#$FD9B; Attr:daFinal; Ch1:#$0646; Ch2:#$0645; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM
  8192. (Unicode:#$FD9C; Attr:daFinal; Ch1:#$064A; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
  8193. (Unicode:#$FD9D; Attr:daInitial; Ch1:#$064A; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
  8194. (Unicode:#$FD9E; Attr:daFinal; Ch1:#$0628; Ch2:#$062E; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM
  8195. (Unicode:#$FD9F; Attr:daFinal; Ch1:#$062A; Ch2:#$062C; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM
  8196. (Unicode:#$FDA0; Attr:daFinal; Ch1:#$062A; Ch2:#$062C; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM
  8197. (Unicode:#$FDA1; Attr:daFinal; Ch1:#$062A; Ch2:#$062E; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM
  8198. (Unicode:#$FDA2; Attr:daFinal; Ch1:#$062A; Ch2:#$062E; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM
  8199. (Unicode:#$FDA3; Attr:daFinal; Ch1:#$062A; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM
  8200. (Unicode:#$FDA4; Attr:daFinal; Ch1:#$062A; Ch2:#$0645; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM
  8201. (Unicode:#$FDA5; Attr:daFinal; Ch1:#$062C; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM
  8202. (Unicode:#$FDA6; Attr:daFinal; Ch1:#$062C; Ch2:#$062D; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM
  8203. (Unicode:#$FDA7; Attr:daFinal; Ch1:#$062C; Ch2:#$0645; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM
  8204. (Unicode:#$FDA8; Attr:daFinal; Ch1:#$0633; Ch2:#$062E; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM
  8205. (Unicode:#$FDA9; Attr:daFinal; Ch1:#$0635; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM
  8206. (Unicode:#$FDAA; Attr:daFinal; Ch1:#$0634; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM
  8207. (Unicode:#$FDAB; Attr:daFinal; Ch1:#$0636; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM
  8208. (Unicode:#$FDAC; Attr:daFinal; Ch1:#$0644; Ch2:#$062C; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM
  8209. (Unicode:#$FDAD; Attr:daFinal; Ch1:#$0644; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM
  8210. (Unicode:#$FDAE; Attr:daFinal; Ch1:#$064A; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM
  8211. (Unicode:#$FDAF; Attr:daFinal; Ch1:#$064A; Ch2:#$062C; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM
  8212. (Unicode:#$FDB0; Attr:daFinal; Ch1:#$064A; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM
  8213. (Unicode:#$FDB1; Attr:daFinal; Ch1:#$0645; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM
  8214. (Unicode:#$FDB2; Attr:daFinal; Ch1:#$0642; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM
  8215. (Unicode:#$FDB3; Attr:daFinal; Ch1:#$0646; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
  8216. (Unicode:#$FDB4; Attr:daInitial; Ch1:#$0642; Ch2:#$0645; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM
  8217. (Unicode:#$FDB5; Attr:daInitial; Ch1:#$0644; Ch2:#$062D; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
  8218. (Unicode:#$FDB6; Attr:daFinal; Ch1:#$0639; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM
  8219. (Unicode:#$FDB7; Attr:daFinal; Ch1:#$0643; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
  8220. (Unicode:#$FDB8; Attr:daInitial; Ch1:#$0646; Ch2:#$062C; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
  8221. (Unicode:#$FDB9; Attr:daFinal; Ch1:#$0645; Ch2:#$062E; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
  8222. (Unicode:#$FDBA; Attr:daInitial; Ch1:#$0644; Ch2:#$062C; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
  8223. (Unicode:#$FDBB; Attr:daFinal; Ch1:#$0643; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM
  8224. (Unicode:#$FDBC; Attr:daFinal; Ch1:#$0644; Ch2:#$062C; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM
  8225. (Unicode:#$FDBD; Attr:daFinal; Ch1:#$0646; Ch2:#$062C; Ch3:#$062D; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM
  8226. (Unicode:#$FDBE; Attr:daFinal; Ch1:#$062C; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM
  8227. (Unicode:#$FDBF; Attr:daFinal; Ch1:#$062D; Ch2:#$062C; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM
  8228. (Unicode:#$FDC0; Attr:daFinal; Ch1:#$0645; Ch2:#$062C; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM
  8229. (Unicode:#$FDC1; Attr:daFinal; Ch1:#$0641; Ch2:#$0645; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM
  8230. (Unicode:#$FDC2; Attr:daFinal; Ch1:#$0628; Ch2:#$062D; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
  8231. (Unicode:#$FDC3; Attr:daInitial; Ch1:#$0643; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM
  8232. (Unicode:#$FDC4; Attr:daInitial; Ch1:#$0639; Ch2:#$062C; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM
  8233. (Unicode:#$FDC5; Attr:daInitial; Ch1:#$0635; Ch2:#$0645; Ch3:#$0645; Ch4:#$FFFF), // ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
  8234. (Unicode:#$FDC6; Attr:daFinal; Ch1:#$0633; Ch2:#$062E; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM
  8235. (Unicode:#$FDC7; Attr:daFinal; Ch1:#$0646; Ch2:#$062C; Ch3:#$064A; Ch4:#$FFFF), // ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
  8236. (Unicode:#$FDF0; Attr:daIsolated; Ch1:#$0635; Ch2:#$0644; Ch3:#$06D2; Ch4:#$FFFF), // ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
  8237. (Unicode:#$FDF1; Attr:daIsolated; Ch1:#$0642; Ch2:#$0644; Ch3:#$06D2; Ch4:#$FFFF), // ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM
  8238. (Unicode:#$FDF2; Attr:daIsolated; Ch1:#$0627; Ch2:#$0644; Ch3:#$0644; Ch4:#$0647; Ch5:#$FFFF), // ARABIC LIGATURE ALLAH ISOLATED FORM
  8239. (Unicode:#$FDF3; Attr:daIsolated; Ch1:#$0627; Ch2:#$0643; Ch3:#$0628; Ch4:#$0631; Ch5:#$FFFF), // ARABIC LIGATURE AKBAR ISOLATED FORM
  8240. (Unicode:#$FDF4; Attr:daIsolated; Ch1:#$0645; Ch2:#$062D; Ch3:#$0645; Ch4:#$062F; Ch5:#$FFFF), // ARABIC LIGATURE MOHAMMAD ISOLATED FORM
  8241. (Unicode:#$FDF5; Attr:daIsolated; Ch1:#$0635; Ch2:#$0644; Ch3:#$0639; Ch4:#$0645; Ch5:#$FFFF), // ARABIC LIGATURE SALAM ISOLATED FORM
  8242. (Unicode:#$FDF6; Attr:daIsolated; Ch1:#$0631; Ch2:#$0633; Ch3:#$0648; Ch4:#$0644; Ch5:#$FFFF), // ARABIC LIGATURE RASOUL ISOLATED FORM
  8243. (Unicode:#$FDF7; Attr:daIsolated; Ch1:#$0639; Ch2:#$0644; Ch3:#$064A; Ch4:#$0647; Ch5:#$FFFF), // ARABIC LIGATURE ALAYHE ISOLATED FORM
  8244. (Unicode:#$FDF8; Attr:daIsolated; Ch1:#$0648; Ch2:#$0633; Ch3:#$0644; Ch4:#$0645; Ch5:#$FFFF), // ARABIC LIGATURE WASALLAM ISOLATED FORM
  8245. (Unicode:#$FDF9; Attr:daIsolated; Ch1:#$0635; Ch2:#$0644; Ch3:#$0649; Ch4:#$FFFF), // ARABIC LIGATURE SALLA ISOLATED FORM
  8246. (Unicode:#$FE30; Attr:daVertical; Ch1:#$2025; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
  8247. (Unicode:#$FE31; Attr:daVertical; Ch1:#$2014; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL EM DASH
  8248. (Unicode:#$FE32; Attr:daVertical; Ch1:#$2013; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL EN DASH
  8249. (Unicode:#$FE33; Attr:daVertical; Ch1:#$005F; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LOW LINE
  8250. (Unicode:#$FE34; Attr:daVertical; Ch1:#$005F; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
  8251. (Unicode:#$FE35; Attr:daVertical; Ch1:#$0028; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
  8252. (Unicode:#$FE36; Attr:daVertical; Ch1:#$0029; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
  8253. (Unicode:#$FE37; Attr:daVertical; Ch1:#$007B; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
  8254. (Unicode:#$FE38; Attr:daVertical; Ch1:#$007D; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
  8255. (Unicode:#$FE39; Attr:daVertical; Ch1:#$3014; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
  8256. (Unicode:#$FE3A; Attr:daVertical; Ch1:#$3015; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
  8257. (Unicode:#$FE3B; Attr:daVertical; Ch1:#$3010; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
  8258. (Unicode:#$FE3C; Attr:daVertical; Ch1:#$3011; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
  8259. (Unicode:#$FE3D; Attr:daVertical; Ch1:#$300A; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
  8260. (Unicode:#$FE3E; Attr:daVertical; Ch1:#$300B; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
  8261. (Unicode:#$FE3F; Attr:daVertical; Ch1:#$3008; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
  8262. (Unicode:#$FE40; Attr:daVertical; Ch1:#$3009; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
  8263. (Unicode:#$FE41; Attr:daVertical; Ch1:#$300C; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
  8264. (Unicode:#$FE42; Attr:daVertical; Ch1:#$300D; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
  8265. (Unicode:#$FE43; Attr:daVertical; Ch1:#$300E; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
  8266. (Unicode:#$FE44; Attr:daVertical; Ch1:#$300F; Ch2:#$FFFF), // PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
  8267. (Unicode:#$FE49; Attr:daCompat; Ch1:#$203E; Ch2:#$FFFF), // DASHED OVERLINE
  8268. (Unicode:#$FE4A; Attr:daCompat; Ch1:#$203E; Ch2:#$FFFF), // CENTRELINE OVERLINE
  8269. (Unicode:#$FE4B; Attr:daCompat; Ch1:#$203E; Ch2:#$FFFF), // WAVY OVERLINE
  8270. (Unicode:#$FE4C; Attr:daCompat; Ch1:#$203E; Ch2:#$FFFF), // DOUBLE WAVY OVERLINE
  8271. (Unicode:#$FE4D; Attr:daCompat; Ch1:#$005F; Ch2:#$FFFF), // DASHED LOW LINE
  8272. (Unicode:#$FE4E; Attr:daCompat; Ch1:#$005F; Ch2:#$FFFF), // CENTRELINE LOW LINE
  8273. (Unicode:#$FE4F; Attr:daCompat; Ch1:#$005F; Ch2:#$FFFF), // WAVY LOW LINE
  8274. (Unicode:#$FE50; Attr:daSmall; Ch1:#$002C; Ch2:#$FFFF), // SMALL COMMA
  8275. (Unicode:#$FE51; Attr:daSmall; Ch1:#$3001; Ch2:#$FFFF), // SMALL IDEOGRAPHIC COMMA
  8276. (Unicode:#$FE52; Attr:daSmall; Ch1:#$002E; Ch2:#$FFFF), // SMALL FULL STOP
  8277. (Unicode:#$FE54; Attr:daSmall; Ch1:#$003B; Ch2:#$FFFF), // SMALL SEMICOLON
  8278. (Unicode:#$FE55; Attr:daSmall; Ch1:#$003A; Ch2:#$FFFF), // SMALL COLON
  8279. (Unicode:#$FE56; Attr:daSmall; Ch1:#$003F; Ch2:#$FFFF), // SMALL QUESTION MARK
  8280. (Unicode:#$FE57; Attr:daSmall; Ch1:#$0021; Ch2:#$FFFF), // SMALL EXCLAMATION MARK
  8281. (Unicode:#$FE58; Attr:daSmall; Ch1:#$2014; Ch2:#$FFFF), // SMALL EM DASH
  8282. (Unicode:#$FE59; Attr:daSmall; Ch1:#$0028; Ch2:#$FFFF), // SMALL LEFT PARENTHESIS
  8283. (Unicode:#$FE5A; Attr:daSmall; Ch1:#$0029; Ch2:#$FFFF), // SMALL RIGHT PARENTHESIS
  8284. (Unicode:#$FE5B; Attr:daSmall; Ch1:#$007B; Ch2:#$FFFF), // SMALL LEFT CURLY BRACKET
  8285. (Unicode:#$FE5C; Attr:daSmall; Ch1:#$007D; Ch2:#$FFFF), // SMALL RIGHT CURLY BRACKET
  8286. (Unicode:#$FE5D; Attr:daSmall; Ch1:#$3014; Ch2:#$FFFF), // SMALL LEFT TORTOISE SHELL BRACKET
  8287. (Unicode:#$FE5E; Attr:daSmall; Ch1:#$3015; Ch2:#$FFFF), // SMALL RIGHT TORTOISE SHELL BRACKET
  8288. (Unicode:#$FE5F; Attr:daSmall; Ch1:#$0023; Ch2:#$FFFF), // SMALL NUMBER SIGN
  8289. (Unicode:#$FE60; Attr:daSmall; Ch1:#$0026; Ch2:#$FFFF), // SMALL AMPERSAND
  8290. (Unicode:#$FE61; Attr:daSmall; Ch1:#$002A; Ch2:#$FFFF), // SMALL ASTERISK
  8291. (Unicode:#$FE62; Attr:daSmall; Ch1:#$002B; Ch2:#$FFFF), // SMALL PLUS SIGN
  8292. (Unicode:#$FE63; Attr:daSmall; Ch1:#$002D; Ch2:#$FFFF), // SMALL HYPHEN-MINUS
  8293. (Unicode:#$FE64; Attr:daSmall; Ch1:#$003C; Ch2:#$FFFF), // SMALL LESS-THAN SIGN
  8294. (Unicode:#$FE65; Attr:daSmall; Ch1:#$003E; Ch2:#$FFFF), // SMALL GREATER-THAN SIGN
  8295. (Unicode:#$FE66; Attr:daSmall; Ch1:#$003D; Ch2:#$FFFF), // SMALL EQUALS SIGN
  8296. (Unicode:#$FE68; Attr:daSmall; Ch1:#$005C; Ch2:#$FFFF), // SMALL REVERSE SOLIDUS
  8297. (Unicode:#$FE69; Attr:daSmall; Ch1:#$0024; Ch2:#$FFFF), // SMALL DOLLAR SIGN
  8298. (Unicode:#$FE6A; Attr:daSmall; Ch1:#$0025; Ch2:#$FFFF), // SMALL PERCENT SIGN
  8299. (Unicode:#$FE6B; Attr:daSmall; Ch1:#$0040; Ch2:#$FFFF), // SMALL COMMERCIAL AT
  8300. (Unicode:#$FE70; Attr:daIsolated; Ch1:#$0020; Ch2:#$064B; Ch3:#$FFFF),// ARABIC FATHATAN ISOLATED FORM
  8301. (Unicode:#$FE71; Attr:daMedial; Ch1:#$0640; Ch2:#$064B; Ch3:#$FFFF), // ARABIC TATWEEL WITH FATHATAN ABOVE
  8302. (Unicode:#$FE72; Attr:daIsolated; Ch1:#$0020; Ch2:#$064C; Ch3:#$FFFF),// ARABIC DAMMATAN ISOLATED FORM
  8303. (Unicode:#$FE74; Attr:daIsolated; Ch1:#$0020; Ch2:#$064D; Ch3:#$FFFF),// ARABIC KASRATAN ISOLATED FORM
  8304. (Unicode:#$FE76; Attr:daIsolated; Ch1:#$0020; Ch2:#$064E; Ch3:#$FFFF),// ARABIC FATHA ISOLATED FORM
  8305. (Unicode:#$FE77; Attr:daMedial; Ch1:#$0640; Ch2:#$064E; Ch3:#$FFFF), // ARABIC FATHA MEDIAL FORM
  8306. (Unicode:#$FE78; Attr:daIsolated; Ch1:#$0020; Ch2:#$064F; Ch3:#$FFFF),// ARABIC DAMMA ISOLATED FORM
  8307. (Unicode:#$FE79; Attr:daMedial; Ch1:#$0640; Ch2:#$064F; Ch3:#$FFFF), // ARABIC DAMMA MEDIAL FORM
  8308. (Unicode:#$FE7A; Attr:daIsolated; Ch1:#$0020; Ch2:#$0650; Ch3:#$FFFF),// ARABIC KASRA ISOLATED FORM
  8309. (Unicode:#$FE7B; Attr:daMedial; Ch1:#$0640; Ch2:#$0650; Ch3:#$FFFF), // ARABIC KASRA MEDIAL FORM
  8310. (Unicode:#$FE7C; Attr:daIsolated; Ch1:#$0020; Ch2:#$0651; Ch3:#$FFFF),// ARABIC SHADDA ISOLATED FORM
  8311. (Unicode:#$FE7D; Attr:daMedial; Ch1:#$0640; Ch2:#$0651; Ch3:#$FFFF), // ARABIC SHADDA MEDIAL FORM
  8312. (Unicode:#$FE7E; Attr:daIsolated; Ch1:#$0020; Ch2:#$0652; Ch3:#$FFFF),// ARABIC SUKUN ISOLATED FORM
  8313. (Unicode:#$FE7F; Attr:daMedial; Ch1:#$0640; Ch2:#$0652; Ch3:#$FFFF), // ARABIC SUKUN MEDIAL FORM
  8314. (Unicode:#$FE80; Attr:daIsolated; Ch1:#$0621; Ch2:#$FFFF), // ARABIC LETTER HAMZA ISOLATED FORM
  8315. (Unicode:#$FE81; Attr:daIsolated; Ch1:#$0622; Ch2:#$FFFF), // ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
  8316. (Unicode:#$FE82; Attr:daFinal; Ch1:#$0622; Ch2:#$FFFF), // ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
  8317. (Unicode:#$FE83; Attr:daIsolated; Ch1:#$0623; Ch2:#$FFFF), // ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
  8318. (Unicode:#$FE84; Attr:daFinal; Ch1:#$0623; Ch2:#$FFFF), // ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
  8319. (Unicode:#$FE85; Attr:daIsolated; Ch1:#$0624; Ch2:#$FFFF), // ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
  8320. (Unicode:#$FE86; Attr:daFinal; Ch1:#$0624; Ch2:#$FFFF), // ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
  8321. (Unicode:#$FE87; Attr:daIsolated; Ch1:#$0625; Ch2:#$FFFF), // ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
  8322. (Unicode:#$FE88; Attr:daFinal; Ch1:#$0625; Ch2:#$FFFF), // ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
  8323. (Unicode:#$FE89; Attr:daIsolated; Ch1:#$0626; Ch2:#$FFFF), // ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
  8324. (Unicode:#$FE8A; Attr:daFinal; Ch1:#$0626; Ch2:#$FFFF), // ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
  8325. (Unicode:#$FE8B; Attr:daInitial; Ch1:#$0626; Ch2:#$FFFF), // ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
  8326. (Unicode:#$FE8C; Attr:daMedial; Ch1:#$0626; Ch2:#$FFFF), // ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
  8327. (Unicode:#$FE8D; Attr:daIsolated; Ch1:#$0627; Ch2:#$FFFF), // ARABIC LETTER ALEF ISOLATED FORM
  8328. (Unicode:#$FE8E; Attr:daFinal; Ch1:#$0627; Ch2:#$FFFF), // ARABIC LETTER ALEF FINAL FORM
  8329. (Unicode:#$FE8F; Attr:daIsolated; Ch1:#$0628; Ch2:#$FFFF), // ARABIC LETTER BEH ISOLATED FORM
  8330. (Unicode:#$FE90; Attr:daFinal; Ch1:#$0628; Ch2:#$FFFF), // ARABIC LETTER BEH FINAL FORM
  8331. (Unicode:#$FE91; Attr:daInitial; Ch1:#$0628; Ch2:#$FFFF), // ARABIC LETTER BEH INITIAL FORM
  8332. (Unicode:#$FE92; Attr:daMedial; Ch1:#$0628; Ch2:#$FFFF), // ARABIC LETTER BEH MEDIAL FORM
  8333. (Unicode:#$FE93; Attr:daIsolated; Ch1:#$0629; Ch2:#$FFFF), // ARABIC LETTER TEH MARBUTA ISOLATED FORM
  8334. (Unicode:#$FE94; Attr:daFinal; Ch1:#$0629; Ch2:#$FFFF), // ARABIC LETTER TEH MARBUTA FINAL FORM
  8335. (Unicode:#$FE95; Attr:daIsolated; Ch1:#$062A; Ch2:#$FFFF), // ARABIC LETTER TEH ISOLATED FORM
  8336. (Unicode:#$FE96; Attr:daFinal; Ch1:#$062A; Ch2:#$FFFF), // ARABIC LETTER TEH FINAL FORM
  8337. (Unicode:#$FE97; Attr:daInitial; Ch1:#$062A; Ch2:#$FFFF), // ARABIC LETTER TEH INITIAL FORM
  8338. (Unicode:#$FE98; Attr:daMedial; Ch1:#$062A; Ch2:#$FFFF), // ARABIC LETTER TEH MEDIAL FORM
  8339. (Unicode:#$FE99; Attr:daIsolated; Ch1:#$062B; Ch2:#$FFFF), // ARABIC LETTER THEH ISOLATED FORM
  8340. (Unicode:#$FE9A; Attr:daFinal; Ch1:#$062B; Ch2:#$FFFF), // ARABIC LETTER THEH FINAL FORM
  8341. (Unicode:#$FE9B; Attr:daInitial; Ch1:#$062B; Ch2:#$FFFF), // ARABIC LETTER THEH INITIAL FORM
  8342. (Unicode:#$FE9C; Attr:daMedial; Ch1:#$062B; Ch2:#$FFFF), // ARABIC LETTER THEH MEDIAL FORM
  8343. (Unicode:#$FE9D; Attr:daIsolated; Ch1:#$062C; Ch2:#$FFFF), // ARABIC LETTER JEEM ISOLATED FORM
  8344. (Unicode:#$FE9E; Attr:daFinal; Ch1:#$062C; Ch2:#$FFFF), // ARABIC LETTER JEEM FINAL FORM
  8345. (Unicode:#$FE9F; Attr:daInitial; Ch1:#$062C; Ch2:#$FFFF), // ARABIC LETTER JEEM INITIAL FORM
  8346. (Unicode:#$FEA0; Attr:daMedial; Ch1:#$062C; Ch2:#$FFFF), // ARABIC LETTER JEEM MEDIAL FORM
  8347. (Unicode:#$FEA1; Attr:daIsolated; Ch1:#$062D; Ch2:#$FFFF), // ARABIC LETTER HAH ISOLATED FORM
  8348. (Unicode:#$FEA2; Attr:daFinal; Ch1:#$062D; Ch2:#$FFFF), // ARABIC LETTER HAH FINAL FORM
  8349. (Unicode:#$FEA3; Attr:daInitial; Ch1:#$062D; Ch2:#$FFFF), // ARABIC LETTER HAH INITIAL FORM
  8350. (Unicode:#$FEA4; Attr:daMedial; Ch1:#$062D; Ch2:#$FFFF), // ARABIC LETTER HAH MEDIAL FORM
  8351. (Unicode:#$FEA5; Attr:daIsolated; Ch1:#$062E; Ch2:#$FFFF), // ARABIC LETTER KHAH ISOLATED FORM
  8352. (Unicode:#$FEA6; Attr:daFinal; Ch1:#$062E; Ch2:#$FFFF), // ARABIC LETTER KHAH FINAL FORM
  8353. (Unicode:#$FEA7; Attr:daInitial; Ch1:#$062E; Ch2:#$FFFF), // ARABIC LETTER KHAH INITIAL FORM
  8354. (Unicode:#$FEA8; Attr:daMedial; Ch1:#$062E; Ch2:#$FFFF), // ARABIC LETTER KHAH MEDIAL FORM
  8355. (Unicode:#$FEA9; Attr:daIsolated; Ch1:#$062F; Ch2:#$FFFF), // ARABIC LETTER DAL ISOLATED FORM
  8356. (Unicode:#$FEAA; Attr:daFinal; Ch1:#$062F; Ch2:#$FFFF), // ARABIC LETTER DAL FINAL FORM
  8357. (Unicode:#$FEAB; Attr:daIsolated; Ch1:#$0630; Ch2:#$FFFF), // ARABIC LETTER THAL ISOLATED FORM
  8358. (Unicode:#$FEAC; Attr:daFinal; Ch1:#$0630; Ch2:#$FFFF), // ARABIC LETTER THAL FINAL FORM
  8359. (Unicode:#$FEAD; Attr:daIsolated; Ch1:#$0631; Ch2:#$FFFF), // ARABIC LETTER REH ISOLATED FORM
  8360. (Unicode:#$FEAE; Attr:daFinal; Ch1:#$0631; Ch2:#$FFFF), // ARABIC LETTER REH FINAL FORM
  8361. (Unicode:#$FEAF; Attr:daIsolated; Ch1:#$0632; Ch2:#$FFFF), // ARABIC LETTER ZAIN ISOLATED FORM
  8362. (Unicode:#$FEB0; Attr:daFinal; Ch1:#$0632; Ch2:#$FFFF), // ARABIC LETTER ZAIN FINAL FORM
  8363. (Unicode:#$FEB1; Attr:daIsolated; Ch1:#$0633; Ch2:#$FFFF), // ARABIC LETTER SEEN ISOLATED FORM
  8364. (Unicode:#$FEB2; Attr:daFinal; Ch1:#$0633; Ch2:#$FFFF), // ARABIC LETTER SEEN FINAL FORM
  8365. (Unicode:#$FEB3; Attr:daInitial; Ch1:#$0633; Ch2:#$FFFF), // ARABIC LETTER SEEN INITIAL FORM
  8366. (Unicode:#$FEB4; Attr:daMedial; Ch1:#$0633; Ch2:#$FFFF), // ARABIC LETTER SEEN MEDIAL FORM
  8367. (Unicode:#$FEB5; Attr:daIsolated; Ch1:#$0634; Ch2:#$FFFF), // ARABIC LETTER SHEEN ISOLATED FORM
  8368. (Unicode:#$FEB6; Attr:daFinal; Ch1:#$0634; Ch2:#$FFFF), // ARABIC LETTER SHEEN FINAL FORM
  8369. (Unicode:#$FEB7; Attr:daInitial; Ch1:#$0634; Ch2:#$FFFF), // ARABIC LETTER SHEEN INITIAL FORM
  8370. (Unicode:#$FEB8; Attr:daMedial; Ch1:#$0634; Ch2:#$FFFF), // ARABIC LETTER SHEEN MEDIAL FORM
  8371. (Unicode:#$FEB9; Attr:daIsolated; Ch1:#$0635; Ch2:#$FFFF), // ARABIC LETTER SAD ISOLATED FORM
  8372. (Unicode:#$FEBA; Attr:daFinal; Ch1:#$0635; Ch2:#$FFFF), // ARABIC LETTER SAD FINAL FORM
  8373. (Unicode:#$FEBB; Attr:daInitial; Ch1:#$0635; Ch2:#$FFFF), // ARABIC LETTER SAD INITIAL FORM
  8374. (Unicode:#$FEBC; Attr:daMedial; Ch1:#$0635; Ch2:#$FFFF), // ARABIC LETTER SAD MEDIAL FORM
  8375. (Unicode:#$FEBD; Attr:daIsolated; Ch1:#$0636; Ch2:#$FFFF), // ARABIC LETTER DAD ISOLATED FORM
  8376. (Unicode:#$FEBE; Attr:daFinal; Ch1:#$0636; Ch2:#$FFFF), // ARABIC LETTER DAD FINAL FORM
  8377. (Unicode:#$FEBF; Attr:daInitial; Ch1:#$0636; Ch2:#$FFFF), // ARABIC LETTER DAD INITIAL FORM
  8378. (Unicode:#$FEC0; Attr:daMedial; Ch1:#$0636; Ch2:#$FFFF), // ARABIC LETTER DAD MEDIAL FORM
  8379. (Unicode:#$FEC1; Attr:daIsolated; Ch1:#$0637; Ch2:#$FFFF), // ARABIC LETTER TAH ISOLATED FORM
  8380. (Unicode:#$FEC2; Attr:daFinal; Ch1:#$0637; Ch2:#$FFFF), // ARABIC LETTER TAH FINAL FORM
  8381. (Unicode:#$FEC3; Attr:daInitial; Ch1:#$0637; Ch2:#$FFFF), // ARABIC LETTER TAH INITIAL FORM
  8382. (Unicode:#$FEC4; Attr:daMedial; Ch1:#$0637; Ch2:#$FFFF), // ARABIC LETTER TAH MEDIAL FORM
  8383. (Unicode:#$FEC5; Attr:daIsolated; Ch1:#$0638; Ch2:#$FFFF), // ARABIC LETTER ZAH ISOLATED FORM
  8384. (Unicode:#$FEC6; Attr:daFinal; Ch1:#$0638; Ch2:#$FFFF), // ARABIC LETTER ZAH FINAL FORM
  8385. (Unicode:#$FEC7; Attr:daInitial; Ch1:#$0638; Ch2:#$FFFF), // ARABIC LETTER ZAH INITIAL FORM
  8386. (Unicode:#$FEC8; Attr:daMedial; Ch1:#$0638; Ch2:#$FFFF), // ARABIC LETTER ZAH MEDIAL FORM
  8387. (Unicode:#$FEC9; Attr:daIsolated; Ch1:#$0639; Ch2:#$FFFF), // ARABIC LETTER AIN ISOLATED FORM
  8388. (Unicode:#$FECA; Attr:daFinal; Ch1:#$0639; Ch2:#$FFFF), // ARABIC LETTER AIN FINAL FORM
  8389. (Unicode:#$FECB; Attr:daInitial; Ch1:#$0639; Ch2:#$FFFF), // ARABIC LETTER AIN INITIAL FORM
  8390. (Unicode:#$FECC; Attr:daMedial; Ch1:#$0639; Ch2:#$FFFF), // ARABIC LETTER AIN MEDIAL FORM
  8391. (Unicode:#$FECD; Attr:daIsolated; Ch1:#$063A; Ch2:#$FFFF), // ARABIC LETTER GHAIN ISOLATED FORM
  8392. (Unicode:#$FECE; Attr:daFinal; Ch1:#$063A; Ch2:#$FFFF), // ARABIC LETTER GHAIN FINAL FORM
  8393. (Unicode:#$FECF; Attr:daInitial; Ch1:#$063A; Ch2:#$FFFF), // ARABIC LETTER GHAIN INITIAL FORM
  8394. (Unicode:#$FED0; Attr:daMedial; Ch1:#$063A; Ch2:#$FFFF), // ARABIC LETTER GHAIN MEDIAL FORM
  8395. (Unicode:#$FED1; Attr:daIsolated; Ch1:#$0641; Ch2:#$FFFF), // ARABIC LETTER FEH ISOLATED FORM
  8396. (Unicode:#$FED2; Attr:daFinal; Ch1:#$0641; Ch2:#$FFFF), // ARABIC LETTER FEH FINAL FORM
  8397. (Unicode:#$FED3; Attr:daInitial; Ch1:#$0641; Ch2:#$FFFF), // ARABIC LETTER FEH INITIAL FORM
  8398. (Unicode:#$FED4; Attr:daMedial; Ch1:#$0641; Ch2:#$FFFF), // ARABIC LETTER FEH MEDIAL FORM
  8399. (Unicode:#$FED5; Attr:daIsolated; Ch1:#$0642; Ch2:#$FFFF), // ARABIC LETTER QAF ISOLATED FORM
  8400. (Unicode:#$FED6; Attr:daFinal; Ch1:#$0642; Ch2:#$FFFF), // ARABIC LETTER QAF FINAL FORM
  8401. (Unicode:#$FED7; Attr:daInitial; Ch1:#$0642; Ch2:#$FFFF), // ARABIC LETTER QAF INITIAL FORM
  8402. (Unicode:#$FED8; Attr:daMedial; Ch1:#$0642; Ch2:#$FFFF), // ARABIC LETTER QAF MEDIAL FORM
  8403. (Unicode:#$FED9; Attr:daIsolated; Ch1:#$0643; Ch2:#$FFFF), // ARABIC LETTER KAF ISOLATED FORM
  8404. (Unicode:#$FEDA; Attr:daFinal; Ch1:#$0643; Ch2:#$FFFF), // ARABIC LETTER KAF FINAL FORM
  8405. (Unicode:#$FEDB; Attr:daInitial; Ch1:#$0643; Ch2:#$FFFF), // ARABIC LETTER KAF INITIAL FORM
  8406. (Unicode:#$FEDC; Attr:daMedial; Ch1:#$0643; Ch2:#$FFFF), // ARABIC LETTER KAF MEDIAL FORM
  8407. (Unicode:#$FEDD; Attr:daIsolated; Ch1:#$0644; Ch2:#$FFFF), // ARABIC LETTER LAM ISOLATED FORM
  8408. (Unicode:#$FEDE; Attr:daFinal; Ch1:#$0644; Ch2:#$FFFF), // ARABIC LETTER LAM FINAL FORM
  8409. (Unicode:#$FEDF; Attr:daInitial; Ch1:#$0644; Ch2:#$FFFF), // ARABIC LETTER LAM INITIAL FORM
  8410. (Unicode:#$FEE0; Attr:daMedial; Ch1:#$0644; Ch2:#$FFFF), // ARABIC LETTER LAM MEDIAL FORM
  8411. (Unicode:#$FEE1; Attr:daIsolated; Ch1:#$0645; Ch2:#$FFFF), // ARABIC LETTER MEEM ISOLATED FORM
  8412. (Unicode:#$FEE2; Attr:daFinal; Ch1:#$0645; Ch2:#$FFFF), // ARABIC LETTER MEEM FINAL FORM
  8413. (Unicode:#$FEE3; Attr:daInitial; Ch1:#$0645; Ch2:#$FFFF), // ARABIC LETTER MEEM INITIAL FORM
  8414. (Unicode:#$FEE4; Attr:daMedial; Ch1:#$0645; Ch2:#$FFFF), // ARABIC LETTER MEEM MEDIAL FORM
  8415. (Unicode:#$FEE5; Attr:daIsolated; Ch1:#$0646; Ch2:#$FFFF), // ARABIC LETTER NOON ISOLATED FORM
  8416. (Unicode:#$FEE6; Attr:daFinal; Ch1:#$0646; Ch2:#$FFFF), // ARABIC LETTER NOON FINAL FORM
  8417. (Unicode:#$FEE7; Attr:daInitial; Ch1:#$0646; Ch2:#$FFFF), // ARABIC LETTER NOON INITIAL FORM
  8418. (Unicode:#$FEE8; Attr:daMedial; Ch1:#$0646; Ch2:#$FFFF), // ARABIC LETTER NOON MEDIAL FORM
  8419. (Unicode:#$FEE9; Attr:daIsolated; Ch1:#$0647; Ch2:#$FFFF), // ARABIC LETTER HEH ISOLATED FORM
  8420. (Unicode:#$FEEA; Attr:daFinal; Ch1:#$0647; Ch2:#$FFFF), // ARABIC LETTER HEH FINAL FORM
  8421. (Unicode:#$FEEB; Attr:daInitial; Ch1:#$0647; Ch2:#$FFFF), // ARABIC LETTER HEH INITIAL FORM
  8422. (Unicode:#$FEEC; Attr:daMedial; Ch1:#$0647; Ch2:#$FFFF), // ARABIC LETTER HEH MEDIAL FORM
  8423. (Unicode:#$FEED; Attr:daIsolated; Ch1:#$0648; Ch2:#$FFFF), // ARABIC LETTER WAW ISOLATED FORM
  8424. (Unicode:#$FEEE; Attr:daFinal; Ch1:#$0648; Ch2:#$FFFF), // ARABIC LETTER WAW FINAL FORM
  8425. (Unicode:#$FEEF; Attr:daIsolated; Ch1:#$0649; Ch2:#$FFFF), // ARABIC LETTER ALEF MAKSURA ISOLATED FORM
  8426. (Unicode:#$FEF0; Attr:daFinal; Ch1:#$0649; Ch2:#$FFFF), // ARABIC LETTER ALEF MAKSURA FINAL FORM
  8427. (Unicode:#$FEF1; Attr:daIsolated; Ch1:#$064A; Ch2:#$FFFF), // ARABIC LETTER YEH ISOLATED FORM
  8428. (Unicode:#$FEF2; Attr:daFinal; Ch1:#$064A; Ch2:#$FFFF), // ARABIC LETTER YEH FINAL FORM
  8429. (Unicode:#$FEF3; Attr:daInitial; Ch1:#$064A; Ch2:#$FFFF), // ARABIC LETTER YEH INITIAL FORM
  8430. (Unicode:#$FEF4; Attr:daMedial; Ch1:#$064A; Ch2:#$FFFF), // ARABIC LETTER YEH MEDIAL FORM
  8431. (Unicode:#$FEF5; Attr:daIsolated; Ch1:#$0644; Ch2:#$0622; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
  8432. (Unicode:#$FEF6; Attr:daFinal; Ch1:#$0644; Ch2:#$0622; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
  8433. (Unicode:#$FEF7; Attr:daIsolated; Ch1:#$0644; Ch2:#$0623; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
  8434. (Unicode:#$FEF8; Attr:daFinal; Ch1:#$0644; Ch2:#$0623; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
  8435. (Unicode:#$FEF9; Attr:daIsolated; Ch1:#$0644; Ch2:#$0625; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
  8436. (Unicode:#$FEFA; Attr:daFinal; Ch1:#$0644; Ch2:#$0625; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
  8437. (Unicode:#$FEFB; Attr:daIsolated; Ch1:#$0644; Ch2:#$0627; Ch3:#$FFFF),// ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
  8438. (Unicode:#$FEFC; Attr:daFinal; Ch1:#$0644; Ch2:#$0627; Ch3:#$FFFF), // ARABIC LIGATURE LAM WITH ALEF FINAL FORM
  8439. (Unicode:#$FF01; Attr:daWide; Ch1:#$0021; Ch2:#$FFFF), // FULLWIDTH EXCLAMATION MARK
  8440. (Unicode:#$FF02; Attr:daWide; Ch1:#$0022; Ch2:#$FFFF), // FULLWIDTH QUOTATION MARK
  8441. (Unicode:#$FF03; Attr:daWide; Ch1:#$0023; Ch2:#$FFFF), // FULLWIDTH NUMBER SIGN
  8442. (Unicode:#$FF04; Attr:daWide; Ch1:#$0024; Ch2:#$FFFF), // FULLWIDTH DOLLAR SIGN
  8443. (Unicode:#$FF05; Attr:daWide; Ch1:#$0025; Ch2:#$FFFF), // FULLWIDTH PERCENT SIGN
  8444. (Unicode:#$FF06; Attr:daWide; Ch1:#$0026; Ch2:#$FFFF), // FULLWIDTH AMPERSAND
  8445. (Unicode:#$FF07; Attr:daWide; Ch1:#$0027; Ch2:#$FFFF), // FULLWIDTH APOSTROPHE
  8446. (Unicode:#$FF08; Attr:daWide; Ch1:#$0028; Ch2:#$FFFF), // FULLWIDTH LEFT PARENTHESIS
  8447. (Unicode:#$FF09; Attr:daWide; Ch1:#$0029; Ch2:#$FFFF), // FULLWIDTH RIGHT PARENTHESIS
  8448. (Unicode:#$FF0A; Attr:daWide; Ch1:#$002A; Ch2:#$FFFF), // FULLWIDTH ASTERISK
  8449. (Unicode:#$FF0B; Attr:daWide; Ch1:#$002B; Ch2:#$FFFF), // FULLWIDTH PLUS SIGN
  8450. (Unicode:#$FF0C; Attr:daWide; Ch1:#$002C; Ch2:#$FFFF), // FULLWIDTH COMMA
  8451. (Unicode:#$FF0D; Attr:daWide; Ch1:#$002D; Ch2:#$FFFF), // FULLWIDTH HYPHEN-MINUS
  8452. (Unicode:#$FF0E; Attr:daWide; Ch1:#$002E; Ch2:#$FFFF), // FULLWIDTH FULL STOP
  8453. (Unicode:#$FF0F; Attr:daWide; Ch1:#$002F; Ch2:#$FFFF), // FULLWIDTH SOLIDUS
  8454. (Unicode:#$FF10; Attr:daWide; Ch1:#$0030; Ch2:#$FFFF), // FULLWIDTH DIGIT ZERO
  8455. (Unicode:#$FF11; Attr:daWide; Ch1:#$0031; Ch2:#$FFFF), // FULLWIDTH DIGIT ONE
  8456. (Unicode:#$FF12; Attr:daWide; Ch1:#$0032; Ch2:#$FFFF), // FULLWIDTH DIGIT TWO
  8457. (Unicode:#$FF13; Attr:daWide; Ch1:#$0033; Ch2:#$FFFF), // FULLWIDTH DIGIT THREE
  8458. (Unicode:#$FF14; Attr:daWide; Ch1:#$0034; Ch2:#$FFFF), // FULLWIDTH DIGIT FOUR
  8459. (Unicode:#$FF15; Attr:daWide; Ch1:#$0035; Ch2:#$FFFF), // FULLWIDTH DIGIT FIVE
  8460. (Unicode:#$FF16; Attr:daWide; Ch1:#$0036; Ch2:#$FFFF), // FULLWIDTH DIGIT SIX
  8461. (Unicode:#$FF17; Attr:daWide; Ch1:#$0037; Ch2:#$FFFF), // FULLWIDTH DIGIT SEVEN
  8462. (Unicode:#$FF18; Attr:daWide; Ch1:#$0038; Ch2:#$FFFF), // FULLWIDTH DIGIT EIGHT
  8463. (Unicode:#$FF19; Attr:daWide; Ch1:#$0039; Ch2:#$FFFF), // FULLWIDTH DIGIT NINE
  8464. (Unicode:#$FF1A; Attr:daWide; Ch1:#$003A; Ch2:#$FFFF), // FULLWIDTH COLON
  8465. (Unicode:#$FF1B; Attr:daWide; Ch1:#$003B; Ch2:#$FFFF), // FULLWIDTH SEMICOLON
  8466. (Unicode:#$FF1C; Attr:daWide; Ch1:#$003C; Ch2:#$FFFF), // FULLWIDTH LESS-THAN SIGN
  8467. (Unicode:#$FF1D; Attr:daWide; Ch1:#$003D; Ch2:#$FFFF), // FULLWIDTH EQUALS SIGN
  8468. (Unicode:#$FF1E; Attr:daWide; Ch1:#$003E; Ch2:#$FFFF), // FULLWIDTH GREATER-THAN SIGN
  8469. (Unicode:#$FF1F; Attr:daWide; Ch1:#$003F; Ch2:#$FFFF), // FULLWIDTH QUESTION MARK
  8470. (Unicode:#$FF20; Attr:daWide; Ch1:#$0040; Ch2:#$FFFF), // FULLWIDTH COMMERCIAL AT
  8471. (Unicode:#$FF21; Attr:daWide; Ch1:#$0041; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER A
  8472. (Unicode:#$FF22; Attr:daWide; Ch1:#$0042; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER B
  8473. (Unicode:#$FF23; Attr:daWide; Ch1:#$0043; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER C
  8474. (Unicode:#$FF24; Attr:daWide; Ch1:#$0044; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER D
  8475. (Unicode:#$FF25; Attr:daWide; Ch1:#$0045; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER E
  8476. (Unicode:#$FF26; Attr:daWide; Ch1:#$0046; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER F
  8477. (Unicode:#$FF27; Attr:daWide; Ch1:#$0047; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER G
  8478. (Unicode:#$FF28; Attr:daWide; Ch1:#$0048; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER H
  8479. (Unicode:#$FF29; Attr:daWide; Ch1:#$0049; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER I
  8480. (Unicode:#$FF2A; Attr:daWide; Ch1:#$004A; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER J
  8481. (Unicode:#$FF2B; Attr:daWide; Ch1:#$004B; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER K
  8482. (Unicode:#$FF2C; Attr:daWide; Ch1:#$004C; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER L
  8483. (Unicode:#$FF2D; Attr:daWide; Ch1:#$004D; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER M
  8484. (Unicode:#$FF2E; Attr:daWide; Ch1:#$004E; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER N
  8485. (Unicode:#$FF2F; Attr:daWide; Ch1:#$004F; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER O
  8486. (Unicode:#$FF30; Attr:daWide; Ch1:#$0050; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER P
  8487. (Unicode:#$FF31; Attr:daWide; Ch1:#$0051; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER Q
  8488. (Unicode:#$FF32; Attr:daWide; Ch1:#$0052; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER R
  8489. (Unicode:#$FF33; Attr:daWide; Ch1:#$0053; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER S
  8490. (Unicode:#$FF34; Attr:daWide; Ch1:#$0054; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER T
  8491. (Unicode:#$FF35; Attr:daWide; Ch1:#$0055; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER U
  8492. (Unicode:#$FF36; Attr:daWide; Ch1:#$0056; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER V
  8493. (Unicode:#$FF37; Attr:daWide; Ch1:#$0057; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER W
  8494. (Unicode:#$FF38; Attr:daWide; Ch1:#$0058; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER X
  8495. (Unicode:#$FF39; Attr:daWide; Ch1:#$0059; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER Y
  8496. (Unicode:#$FF3A; Attr:daWide; Ch1:#$005A; Ch2:#$FFFF), // FULLWIDTH LATIN CAPITAL LETTER Z
  8497. (Unicode:#$FF3B; Attr:daWide; Ch1:#$005B; Ch2:#$FFFF), // FULLWIDTH LEFT SQUARE BRACKET
  8498. (Unicode:#$FF3C; Attr:daWide; Ch1:#$005C; Ch2:#$FFFF), // FULLWIDTH REVERSE SOLIDUS
  8499. (Unicode:#$FF3D; Attr:daWide; Ch1:#$005D; Ch2:#$FFFF), // FULLWIDTH RIGHT SQUARE BRACKET
  8500. (Unicode:#$FF3E; Attr:daWide; Ch1:#$005E; Ch2:#$FFFF), // FULLWIDTH CIRCUMFLEX ACCENT
  8501. (Unicode:#$FF3F; Attr:daWide; Ch1:#$005F; Ch2:#$FFFF), // FULLWIDTH LOW LINE
  8502. (Unicode:#$FF40; Attr:daWide; Ch1:#$0060; Ch2:#$FFFF), // FULLWIDTH GRAVE ACCENT
  8503. (Unicode:#$FF41; Attr:daWide; Ch1:#$0061; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER A
  8504. (Unicode:#$FF42; Attr:daWide; Ch1:#$0062; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER B
  8505. (Unicode:#$FF43; Attr:daWide; Ch1:#$0063; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER C
  8506. (Unicode:#$FF44; Attr:daWide; Ch1:#$0064; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER D
  8507. (Unicode:#$FF45; Attr:daWide; Ch1:#$0065; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER E
  8508. (Unicode:#$FF46; Attr:daWide; Ch1:#$0066; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER F
  8509. (Unicode:#$FF47; Attr:daWide; Ch1:#$0067; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER G
  8510. (Unicode:#$FF48; Attr:daWide; Ch1:#$0068; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER H
  8511. (Unicode:#$FF49; Attr:daWide; Ch1:#$0069; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER I
  8512. (Unicode:#$FF4A; Attr:daWide; Ch1:#$006A; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER J
  8513. (Unicode:#$FF4B; Attr:daWide; Ch1:#$006B; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER K
  8514. (Unicode:#$FF4C; Attr:daWide; Ch1:#$006C; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER L
  8515. (Unicode:#$FF4D; Attr:daWide; Ch1:#$006D; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER M
  8516. (Unicode:#$FF4E; Attr:daWide; Ch1:#$006E; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER N
  8517. (Unicode:#$FF4F; Attr:daWide; Ch1:#$006F; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER O
  8518. (Unicode:#$FF50; Attr:daWide; Ch1:#$0070; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER P
  8519. (Unicode:#$FF51; Attr:daWide; Ch1:#$0071; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER Q
  8520. (Unicode:#$FF52; Attr:daWide; Ch1:#$0072; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER R
  8521. (Unicode:#$FF53; Attr:daWide; Ch1:#$0073; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER S
  8522. (Unicode:#$FF54; Attr:daWide; Ch1:#$0074; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER T
  8523. (Unicode:#$FF55; Attr:daWide; Ch1:#$0075; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER U
  8524. (Unicode:#$FF56; Attr:daWide; Ch1:#$0076; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER V
  8525. (Unicode:#$FF57; Attr:daWide; Ch1:#$0077; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER W
  8526. (Unicode:#$FF58; Attr:daWide; Ch1:#$0078; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER X
  8527. (Unicode:#$FF59; Attr:daWide; Ch1:#$0079; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER Y
  8528. (Unicode:#$FF5A; Attr:daWide; Ch1:#$007A; Ch2:#$FFFF), // FULLWIDTH LATIN SMALL LETTER Z
  8529. (Unicode:#$FF5B; Attr:daWide; Ch1:#$007B; Ch2:#$FFFF), // FULLWIDTH LEFT CURLY BRACKET
  8530. (Unicode:#$FF5C; Attr:daWide; Ch1:#$007C; Ch2:#$FFFF), // FULLWIDTH VERTICAL LINE
  8531. (Unicode:#$FF5D; Attr:daWide; Ch1:#$007D; Ch2:#$FFFF), // FULLWIDTH RIGHT CURLY BRACKET
  8532. (Unicode:#$FF5E; Attr:daWide; Ch1:#$007E; Ch2:#$FFFF), // FULLWIDTH TILDE
  8533. (Unicode:#$FF61; Attr:daNarrow; Ch1:#$3002; Ch2:#$FFFF), // HALFWIDTH IDEOGRAPHIC FULL STOP
  8534. (Unicode:#$FF62; Attr:daNarrow; Ch1:#$300C; Ch2:#$FFFF), // HALFWIDTH LEFT CORNER BRACKET
  8535. (Unicode:#$FF63; Attr:daNarrow; Ch1:#$300D; Ch2:#$FFFF), // HALFWIDTH RIGHT CORNER BRACKET
  8536. (Unicode:#$FF64; Attr:daNarrow; Ch1:#$3001; Ch2:#$FFFF), // HALFWIDTH IDEOGRAPHIC COMMA
  8537. (Unicode:#$FF65; Attr:daNarrow; Ch1:#$30FB; Ch2:#$FFFF), // HALFWIDTH KATAKANA MIDDLE DOT
  8538. (Unicode:#$FF66; Attr:daNarrow; Ch1:#$30F2; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER WO
  8539. (Unicode:#$FF67; Attr:daNarrow; Ch1:#$30A1; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL A
  8540. (Unicode:#$FF68; Attr:daNarrow; Ch1:#$30A3; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL I
  8541. (Unicode:#$FF69; Attr:daNarrow; Ch1:#$30A5; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL U
  8542. (Unicode:#$FF6A; Attr:daNarrow; Ch1:#$30A7; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL E
  8543. (Unicode:#$FF6B; Attr:daNarrow; Ch1:#$30A9; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL O
  8544. (Unicode:#$FF6C; Attr:daNarrow; Ch1:#$30E3; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL YA
  8545. (Unicode:#$FF6D; Attr:daNarrow; Ch1:#$30E5; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL YU
  8546. (Unicode:#$FF6E; Attr:daNarrow; Ch1:#$30E7; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL YO
  8547. (Unicode:#$FF6F; Attr:daNarrow; Ch1:#$30C3; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SMALL TU
  8548. (Unicode:#$FF70; Attr:daNarrow; Ch1:#$30FC; Ch2:#$FFFF), // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
  8549. (Unicode:#$FF71; Attr:daNarrow; Ch1:#$30A2; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER A
  8550. (Unicode:#$FF72; Attr:daNarrow; Ch1:#$30A4; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER I
  8551. (Unicode:#$FF73; Attr:daNarrow; Ch1:#$30A6; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER U
  8552. (Unicode:#$FF74; Attr:daNarrow; Ch1:#$30A8; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER E
  8553. (Unicode:#$FF75; Attr:daNarrow; Ch1:#$30AA; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER O
  8554. (Unicode:#$FF76; Attr:daNarrow; Ch1:#$30AB; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER KA
  8555. (Unicode:#$FF77; Attr:daNarrow; Ch1:#$30AD; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER KI
  8556. (Unicode:#$FF78; Attr:daNarrow; Ch1:#$30AF; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER KU
  8557. (Unicode:#$FF79; Attr:daNarrow; Ch1:#$30B1; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER KE
  8558. (Unicode:#$FF7A; Attr:daNarrow; Ch1:#$30B3; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER KO
  8559. (Unicode:#$FF7B; Attr:daNarrow; Ch1:#$30B5; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SA
  8560. (Unicode:#$FF7C; Attr:daNarrow; Ch1:#$30B7; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SI
  8561. (Unicode:#$FF7D; Attr:daNarrow; Ch1:#$30B9; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SU
  8562. (Unicode:#$FF7E; Attr:daNarrow; Ch1:#$30BB; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SE
  8563. (Unicode:#$FF7F; Attr:daNarrow; Ch1:#$30BD; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER SO
  8564. (Unicode:#$FF80; Attr:daNarrow; Ch1:#$30BF; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER TA
  8565. (Unicode:#$FF81; Attr:daNarrow; Ch1:#$30C1; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER TI
  8566. (Unicode:#$FF82; Attr:daNarrow; Ch1:#$30C4; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER TU
  8567. (Unicode:#$FF83; Attr:daNarrow; Ch1:#$30C6; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER TE
  8568. (Unicode:#$FF84; Attr:daNarrow; Ch1:#$30C8; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER TO
  8569. (Unicode:#$FF85; Attr:daNarrow; Ch1:#$30CA; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER NA
  8570. (Unicode:#$FF86; Attr:daNarrow; Ch1:#$30CB; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER NI
  8571. (Unicode:#$FF87; Attr:daNarrow; Ch1:#$30CC; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER NU
  8572. (Unicode:#$FF88; Attr:daNarrow; Ch1:#$30CD; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER NE
  8573. (Unicode:#$FF89; Attr:daNarrow; Ch1:#$30CE; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER NO
  8574. (Unicode:#$FF8A; Attr:daNarrow; Ch1:#$30CF; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER HA
  8575. (Unicode:#$FF8B; Attr:daNarrow; Ch1:#$30D2; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER HI
  8576. (Unicode:#$FF8C; Attr:daNarrow; Ch1:#$30D5; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER HU
  8577. (Unicode:#$FF8D; Attr:daNarrow; Ch1:#$30D8; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER HE
  8578. (Unicode:#$FF8E; Attr:daNarrow; Ch1:#$30DB; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER HO
  8579. (Unicode:#$FF8F; Attr:daNarrow; Ch1:#$30DE; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER MA
  8580. (Unicode:#$FF90; Attr:daNarrow; Ch1:#$30DF; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER MI
  8581. (Unicode:#$FF91; Attr:daNarrow; Ch1:#$30E0; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER MU
  8582. (Unicode:#$FF92; Attr:daNarrow; Ch1:#$30E1; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER ME
  8583. (Unicode:#$FF93; Attr:daNarrow; Ch1:#$30E2; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER MO
  8584. (Unicode:#$FF94; Attr:daNarrow; Ch1:#$30E4; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER YA
  8585. (Unicode:#$FF95; Attr:daNarrow; Ch1:#$30E6; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER YU
  8586. (Unicode:#$FF96; Attr:daNarrow; Ch1:#$30E8; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER YO
  8587. (Unicode:#$FF97; Attr:daNarrow; Ch1:#$30E9; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER RA
  8588. (Unicode:#$FF98; Attr:daNarrow; Ch1:#$30EA; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER RI
  8589. (Unicode:#$FF99; Attr:daNarrow; Ch1:#$30EB; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER RU
  8590. (Unicode:#$FF9A; Attr:daNarrow; Ch1:#$30EC; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER RE
  8591. (Unicode:#$FF9B; Attr:daNarrow; Ch1:#$30ED; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER RO
  8592. (Unicode:#$FF9C; Attr:daNarrow; Ch1:#$30EF; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER WA
  8593. (Unicode:#$FF9D; Attr:daNarrow; Ch1:#$30F3; Ch2:#$FFFF), // HALFWIDTH KATAKANA LETTER N
  8594. (Unicode:#$FF9E; Attr:daNarrow; Ch1:#$3099; Ch2:#$FFFF), // HALFWIDTH KATAKANA VOICED SOUND MARK
  8595. (Unicode:#$FF9F; Attr:daNarrow; Ch1:#$309A; Ch2:#$FFFF), // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
  8596. (Unicode:#$FFA0; Attr:daNarrow; Ch1:#$3164; Ch2:#$FFFF), // HALFWIDTH HANGUL FILLER
  8597. (Unicode:#$FFA1; Attr:daNarrow; Ch1:#$3131; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER KIYEOK
  8598. (Unicode:#$FFA2; Attr:daNarrow; Ch1:#$3132; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER SSANGKIYEOK
  8599. (Unicode:#$FFA3; Attr:daNarrow; Ch1:#$3133; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER KIYEOK-SIOS
  8600. (Unicode:#$FFA4; Attr:daNarrow; Ch1:#$3134; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER NIEUN
  8601. (Unicode:#$FFA5; Attr:daNarrow; Ch1:#$3135; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER NIEUN-CIEUC
  8602. (Unicode:#$FFA6; Attr:daNarrow; Ch1:#$3136; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER NIEUN-HIEUH
  8603. (Unicode:#$FFA7; Attr:daNarrow; Ch1:#$3137; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER TIKEUT
  8604. (Unicode:#$FFA8; Attr:daNarrow; Ch1:#$3138; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER SSANGTIKEUT
  8605. (Unicode:#$FFA9; Attr:daNarrow; Ch1:#$3139; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER RIEUL
  8606. (Unicode:#$FFAA; Attr:daNarrow; Ch1:#$313A; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER RIEUL-KIYEOK
  8607. (Unicode:#$FFAB; Attr:daNarrow; Ch1:#$313B; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER RIEUL-MIEUM
  8608. (Unicode:#$FFAC; Attr:daNarrow; Ch1:#$313C; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER RIEUL-PIEUP
  8609. (Unicode:#$FFAD; Attr:daNarrow; Ch1:#$313D; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER RIEUL-SIOS
  8610. (Unicode:#$FFAE; Attr:daNarrow; Ch1:#$313E; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER RIEUL-THIEUTH
  8611. (Unicode:#$FFAF; Attr:daNarrow; Ch1:#$313F; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH
  8612. (Unicode:#$FFB0; Attr:daNarrow; Ch1:#$3140; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER RIEUL-HIEUH
  8613. (Unicode:#$FFB1; Attr:daNarrow; Ch1:#$3141; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER MIEUM
  8614. (Unicode:#$FFB2; Attr:daNarrow; Ch1:#$3142; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER PIEUP
  8615. (Unicode:#$FFB3; Attr:daNarrow; Ch1:#$3143; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER SSANGPIEUP
  8616. (Unicode:#$FFB4; Attr:daNarrow; Ch1:#$3144; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER PIEUP-SIOS
  8617. (Unicode:#$FFB5; Attr:daNarrow; Ch1:#$3145; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER SIOS
  8618. (Unicode:#$FFB6; Attr:daNarrow; Ch1:#$3146; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER SSANGSIOS
  8619. (Unicode:#$FFB7; Attr:daNarrow; Ch1:#$3147; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER IEUNG
  8620. (Unicode:#$FFB8; Attr:daNarrow; Ch1:#$3148; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER CIEUC
  8621. (Unicode:#$FFB9; Attr:daNarrow; Ch1:#$3149; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER SSANGCIEUC
  8622. (Unicode:#$FFBA; Attr:daNarrow; Ch1:#$314A; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER CHIEUCH
  8623. (Unicode:#$FFBB; Attr:daNarrow; Ch1:#$314B; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER KHIEUKH
  8624. (Unicode:#$FFBC; Attr:daNarrow; Ch1:#$314C; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER THIEUTH
  8625. (Unicode:#$FFBD; Attr:daNarrow; Ch1:#$314D; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER PHIEUPH
  8626. (Unicode:#$FFBE; Attr:daNarrow; Ch1:#$314E; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER HIEUH
  8627. (Unicode:#$FFC2; Attr:daNarrow; Ch1:#$314F; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER A
  8628. (Unicode:#$FFC3; Attr:daNarrow; Ch1:#$3150; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER AE
  8629. (Unicode:#$FFC4; Attr:daNarrow; Ch1:#$3151; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER YA
  8630. (Unicode:#$FFC5; Attr:daNarrow; Ch1:#$3152; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER YAE
  8631. (Unicode:#$FFC6; Attr:daNarrow; Ch1:#$3153; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER EO
  8632. (Unicode:#$FFC7; Attr:daNarrow; Ch1:#$3154; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER E
  8633. (Unicode:#$FFCA; Attr:daNarrow; Ch1:#$3155; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER YEO
  8634. (Unicode:#$FFCB; Attr:daNarrow; Ch1:#$3156; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER YE
  8635. (Unicode:#$FFCC; Attr:daNarrow; Ch1:#$3157; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER O
  8636. (Unicode:#$FFCD; Attr:daNarrow; Ch1:#$3158; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER WA
  8637. (Unicode:#$FFCE; Attr:daNarrow; Ch1:#$3159; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER WAE
  8638. (Unicode:#$FFCF; Attr:daNarrow; Ch1:#$315A; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER OE
  8639. (Unicode:#$FFD2; Attr:daNarrow; Ch1:#$315B; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER YO
  8640. (Unicode:#$FFD3; Attr:daNarrow; Ch1:#$315C; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER U
  8641. (Unicode:#$FFD4; Attr:daNarrow; Ch1:#$315D; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER WEO
  8642. (Unicode:#$FFD5; Attr:daNarrow; Ch1:#$315E; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER WE
  8643. (Unicode:#$FFD6; Attr:daNarrow; Ch1:#$315F; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER WI
  8644. (Unicode:#$FFD7; Attr:daNarrow; Ch1:#$3160; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER YU
  8645. (Unicode:#$FFDA; Attr:daNarrow; Ch1:#$3161; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER EU
  8646. (Unicode:#$FFDB; Attr:daNarrow; Ch1:#$3162; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER YI
  8647. (Unicode:#$FFDC; Attr:daNarrow; Ch1:#$3163; Ch2:#$FFFF), // HALFWIDTH HANGUL LETTER I
  8648. (Unicode:#$FFE0; Attr:daWide; Ch1:#$00A2; Ch2:#$FFFF), // FULLWIDTH CENT SIGN
  8649. (Unicode:#$FFE1; Attr:daWide; Ch1:#$00A3; Ch2:#$FFFF), // FULLWIDTH POUND SIGN
  8650. (Unicode:#$FFE2; Attr:daWide; Ch1:#$00AC; Ch2:#$FFFF), // FULLWIDTH NOT SIGN
  8651. (Unicode:#$FFE3; Attr:daWide; Ch1:#$00AF; Ch2:#$FFFF), // FULLWIDTH MACRON
  8652. (Unicode:#$FFE4; Attr:daWide; Ch1:#$00A6; Ch2:#$FFFF), // FULLWIDTH BROKEN BAR
  8653. (Unicode:#$FFE5; Attr:daWide; Ch1:#$00A5; Ch2:#$FFFF), // FULLWIDTH YEN SIGN
  8654. (Unicode:#$FFE6; Attr:daWide; Ch1:#$20A9; Ch2:#$FFFF), // FULLWIDTH WON SIGN
  8655. (Unicode:#$FFE8; Attr:daNarrow; Ch1:#$2502; Ch2:#$FFFF), // HALFWIDTH FORMS LIGHT VERTICAL
  8656. (Unicode:#$FFE9; Attr:daNarrow; Ch1:#$2190; Ch2:#$FFFF), // HALFWIDTH LEFTWARDS ARROW
  8657. (Unicode:#$FFEA; Attr:daNarrow; Ch1:#$2191; Ch2:#$FFFF), // HALFWIDTH UPWARDS ARROW
  8658. (Unicode:#$FFEB; Attr:daNarrow; Ch1:#$2192; Ch2:#$FFFF), // HALFWIDTH RIGHTWARDS ARROW
  8659. (Unicode:#$FFEC; Attr:daNarrow; Ch1:#$2193; Ch2:#$FFFF), // HALFWIDTH DOWNWARDS ARROW
  8660. (Unicode:#$FFED; Attr:daNarrow; Ch1:#$25A0; Ch2:#$FFFF), // HALFWIDTH BLACK SQUARE
  8661. (Unicode:#$FFEE; Attr:daNarrow; Ch1:#$25CB; Ch2:#$FFFF) // HALFWIDTH WHITE CIRCLE
  8662. );
  8663. function LocateDecompositionInfoU(const Ch: WideChar): Integer;
  8664. var L, H, I : Integer;
  8665. D : WideChar;
  8666. begin
  8667. if Ord(Ch) < $A0 then // No decompositions for ASCII
  8668. begin
  8669. Result := -1;
  8670. exit;
  8671. end;
  8672. // Binary search
  8673. L := 0;
  8674. H := UnicodeDecompositionEntries - 1;
  8675. repeat
  8676. I := (L + H) div 2;
  8677. D := UnicodeDecompositionInfo[I].Unicode;
  8678. if D = Ch then
  8679. begin
  8680. Result := I;
  8681. exit;
  8682. end else
  8683. if D > Ch then
  8684. H := I - 1 else
  8685. L := I + 1;
  8686. until L > H;
  8687. Result := -1;
  8688. end;
  8689. {$IFDEF CLR}
  8690. function GetCharacterDecompositionU(const Ch: WideChar): WideString;
  8691. var I, J : Integer;
  8692. begin
  8693. I := LocateDecompositionInfoU(Ch);
  8694. if I < 0 then
  8695. // Exceptionally long decompositions not stored in table
  8696. case Ch of
  8697. #$3316 : Result := #$30AD#$30ED#$30E1#$30FC#$30C8#$30EB; // SQUARE KIROMEETORU
  8698. #$33AF : Result := #$0072#$0061#$0064#$2215#$0073#$00B2; // SQUARE RAD OVER S SQUARED
  8699. #$FDFA : Result := #$0635#$0644#$0649#$0020#$0627#$0644#$0644#$0647#$0020#$0639#$0644#$064A#$0647#$0020#$0648#$0633#$0644#$0645; // ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
  8700. #$FDFB : Result := #$062C#$0644#$0020#$062C#$0644#$0627#$0644#$0647; // ARABIC LIGATURE JALLAJALALOUHOU
  8701. else
  8702. Result := '';
  8703. end
  8704. else
  8705. begin
  8706. if UnicodeDecompositionInfo[I].Ch2 = #$FFFF then
  8707. J := 1 else
  8708. if UnicodeDecompositionInfo[I].Ch3 = #$FFFF then
  8709. J := 2 else
  8710. if UnicodeDecompositionInfo[I].Ch4 = #$FFFF then
  8711. J := 3 else
  8712. if UnicodeDecompositionInfo[I].Ch5 = #$FFFF then
  8713. J := 4
  8714. else
  8715. J := 5;
  8716. SetLength(Result, J);
  8717. Result[1] := UnicodeDecompositionInfo[I].Ch1;
  8718. if J > 1 then
  8719. Result[2] := UnicodeDecompositionInfo[I].Ch2;
  8720. if J > 2 then
  8721. Result[3] := UnicodeDecompositionInfo[I].Ch3;
  8722. if J > 3 then
  8723. Result[4] := UnicodeDecompositionInfo[I].Ch4;
  8724. if J > 4 then
  8725. Result[5] := UnicodeDecompositionInfo[I].Ch5;
  8726. end;
  8727. end;
  8728. {$ELSE}
  8729. function UnicodeGetCharacterDecompositionW(const Ch: WideChar): WideString;
  8730. var I, J : Integer;
  8731. P, Q : PWideChar;
  8732. begin
  8733. I := LocateDecompositionInfoU(Ch);
  8734. if I < 0 then
  8735. // Exceptionally long decompositions not stored in table
  8736. case Ch of
  8737. #$3316 : Result := #$30AD#$30ED#$30E1#$30FC#$30C8#$30EB; // SQUARE KIROMEETORU
  8738. #$33AF : Result := #$0072#$0061#$0064#$2215#$0073#$00B2; // SQUARE RAD OVER S SQUARED
  8739. #$FDFA : Result := #$0635#$0644#$0649#$0020#$0627#$0644#$0644#$0647#$0020#$0639#$0644#$064A#$0647#$0020#$0648#$0633#$0644#$0645; // ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM
  8740. #$FDFB : Result := #$062C#$0644#$0020#$062C#$0644#$0627#$0644#$0647; // ARABIC LIGATURE JALLAJALALOUHOU
  8741. else
  8742. Result := '';
  8743. end
  8744. else
  8745. begin
  8746. P := @UnicodeDecompositionInfo[I].Ch1;
  8747. Q := P;
  8748. Inc(Q);
  8749. I := 1;
  8750. while (Q^ <> #$FFFF) and (I < 5) do
  8751. begin
  8752. Inc(Q);
  8753. Inc(I);
  8754. end;
  8755. SetLength(Result, I);
  8756. Q := P;
  8757. P := Pointer(Result);
  8758. for J := 1 to I do
  8759. begin
  8760. P^ := Q^;
  8761. Inc(P);
  8762. Inc(Q);
  8763. end;
  8764. end;
  8765. end;
  8766. {$ENDIF}
  8767. type
  8768. TUnicodeUCS4DecompositionInfo = packed record
  8769. Unicode : UCS4Char;
  8770. Attr : TUnicodeDecompositionAttr;
  8771. Ch1 : WideChar;
  8772. Ch2 : WideChar;
  8773. end;
  8774. PUnicodeUCS4DecompositionInfo = ^TUnicodeUCS4DecompositionInfo;
  8775. const
  8776. UnicodeUCS4DecompositionEntries = 991;
  8777. UnicodeUCS4DecompositionInfo : Array[0..UnicodeUCS4DecompositionEntries - 1] of TUnicodeUCS4DecompositionInfo = (
  8778. (Unicode:$1D400; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL A
  8779. (Unicode:$1D401; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL B
  8780. (Unicode:$1D402; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL C
  8781. (Unicode:$1D403; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL D
  8782. (Unicode:$1D404; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL E
  8783. (Unicode:$1D405; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL F
  8784. (Unicode:$1D406; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL G
  8785. (Unicode:$1D407; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL H
  8786. (Unicode:$1D408; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL I
  8787. (Unicode:$1D409; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL J
  8788. (Unicode:$1D40A; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL K
  8789. (Unicode:$1D40B; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL L
  8790. (Unicode:$1D40C; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL M
  8791. (Unicode:$1D40D; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL N
  8792. (Unicode:$1D40E; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL O
  8793. (Unicode:$1D40F; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL P
  8794. (Unicode:$1D410; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL Q
  8795. (Unicode:$1D411; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL R
  8796. (Unicode:$1D412; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL S
  8797. (Unicode:$1D413; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL T
  8798. (Unicode:$1D414; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL U
  8799. (Unicode:$1D415; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL V
  8800. (Unicode:$1D416; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL W
  8801. (Unicode:$1D417; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL X
  8802. (Unicode:$1D418; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL Y
  8803. (Unicode:$1D419; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL Z
  8804. (Unicode:$1D41A; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL A
  8805. (Unicode:$1D41B; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL B
  8806. (Unicode:$1D41C; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL C
  8807. (Unicode:$1D41D; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL D
  8808. (Unicode:$1D41E; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL E
  8809. (Unicode:$1D41F; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL F
  8810. (Unicode:$1D420; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL G
  8811. (Unicode:$1D421; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL H
  8812. (Unicode:$1D422; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL I
  8813. (Unicode:$1D423; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL J
  8814. (Unicode:$1D424; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL K
  8815. (Unicode:$1D425; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL L
  8816. (Unicode:$1D426; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL M
  8817. (Unicode:$1D427; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL N
  8818. (Unicode:$1D428; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL O
  8819. (Unicode:$1D429; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL P
  8820. (Unicode:$1D42A; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL Q
  8821. (Unicode:$1D42B; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL R
  8822. (Unicode:$1D42C; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL S
  8823. (Unicode:$1D42D; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL T
  8824. (Unicode:$1D42E; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL U
  8825. (Unicode:$1D42F; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL V
  8826. (Unicode:$1D430; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL W
  8827. (Unicode:$1D431; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL X
  8828. (Unicode:$1D432; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL Y
  8829. (Unicode:$1D433; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL Z
  8830. (Unicode:$1D434; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL A
  8831. (Unicode:$1D435; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL B
  8832. (Unicode:$1D436; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL C
  8833. (Unicode:$1D437; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL D
  8834. (Unicode:$1D438; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL E
  8835. (Unicode:$1D439; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL F
  8836. (Unicode:$1D43A; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL G
  8837. (Unicode:$1D43B; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL H
  8838. (Unicode:$1D43C; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL I
  8839. (Unicode:$1D43D; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL J
  8840. (Unicode:$1D43E; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL K
  8841. (Unicode:$1D43F; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL L
  8842. (Unicode:$1D440; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL M
  8843. (Unicode:$1D441; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL N
  8844. (Unicode:$1D442; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL O
  8845. (Unicode:$1D443; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL P
  8846. (Unicode:$1D444; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL Q
  8847. (Unicode:$1D445; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL R
  8848. (Unicode:$1D446; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL S
  8849. (Unicode:$1D447; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL T
  8850. (Unicode:$1D448; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL U
  8851. (Unicode:$1D449; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL V
  8852. (Unicode:$1D44A; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL W
  8853. (Unicode:$1D44B; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL X
  8854. (Unicode:$1D44C; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL Y
  8855. (Unicode:$1D44D; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL Z
  8856. (Unicode:$1D44E; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL A
  8857. (Unicode:$1D44F; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL B
  8858. (Unicode:$1D450; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL C
  8859. (Unicode:$1D451; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL D
  8860. (Unicode:$1D452; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL E
  8861. (Unicode:$1D453; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL F
  8862. (Unicode:$1D454; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL G
  8863. (Unicode:$1D456; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL I
  8864. (Unicode:$1D457; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL J
  8865. (Unicode:$1D458; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL K
  8866. (Unicode:$1D459; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL L
  8867. (Unicode:$1D45A; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL M
  8868. (Unicode:$1D45B; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL N
  8869. (Unicode:$1D45C; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL O
  8870. (Unicode:$1D45D; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL P
  8871. (Unicode:$1D45E; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL Q
  8872. (Unicode:$1D45F; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL R
  8873. (Unicode:$1D460; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL S
  8874. (Unicode:$1D461; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL T
  8875. (Unicode:$1D462; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL U
  8876. (Unicode:$1D463; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL V
  8877. (Unicode:$1D464; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL W
  8878. (Unicode:$1D465; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL X
  8879. (Unicode:$1D466; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL Y
  8880. (Unicode:$1D467; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL Z
  8881. (Unicode:$1D468; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL A
  8882. (Unicode:$1D469; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL B
  8883. (Unicode:$1D46A; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL C
  8884. (Unicode:$1D46B; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL D
  8885. (Unicode:$1D46C; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL E
  8886. (Unicode:$1D46D; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL F
  8887. (Unicode:$1D46E; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL G
  8888. (Unicode:$1D46F; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL H
  8889. (Unicode:$1D470; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL I
  8890. (Unicode:$1D471; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL J
  8891. (Unicode:$1D472; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL K
  8892. (Unicode:$1D473; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL L
  8893. (Unicode:$1D474; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL M
  8894. (Unicode:$1D475; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL N
  8895. (Unicode:$1D476; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL O
  8896. (Unicode:$1D477; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL P
  8897. (Unicode:$1D478; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL Q
  8898. (Unicode:$1D479; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL R
  8899. (Unicode:$1D47A; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL S
  8900. (Unicode:$1D47B; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL T
  8901. (Unicode:$1D47C; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL U
  8902. (Unicode:$1D47D; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL V
  8903. (Unicode:$1D47E; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL W
  8904. (Unicode:$1D47F; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL X
  8905. (Unicode:$1D480; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL Y
  8906. (Unicode:$1D481; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL Z
  8907. (Unicode:$1D482; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL A
  8908. (Unicode:$1D483; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL B
  8909. (Unicode:$1D484; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL C
  8910. (Unicode:$1D485; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL D
  8911. (Unicode:$1D486; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL E
  8912. (Unicode:$1D487; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL F
  8913. (Unicode:$1D488; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL G
  8914. (Unicode:$1D489; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL H
  8915. (Unicode:$1D48A; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL I
  8916. (Unicode:$1D48B; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL J
  8917. (Unicode:$1D48C; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL K
  8918. (Unicode:$1D48D; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL L
  8919. (Unicode:$1D48E; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL M
  8920. (Unicode:$1D48F; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL N
  8921. (Unicode:$1D490; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL O
  8922. (Unicode:$1D491; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL P
  8923. (Unicode:$1D492; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL Q
  8924. (Unicode:$1D493; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL R
  8925. (Unicode:$1D494; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL S
  8926. (Unicode:$1D495; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL T
  8927. (Unicode:$1D496; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL U
  8928. (Unicode:$1D497; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL V
  8929. (Unicode:$1D498; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL W
  8930. (Unicode:$1D499; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL X
  8931. (Unicode:$1D49A; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL Y
  8932. (Unicode:$1D49B; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL Z
  8933. (Unicode:$1D49C; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL A
  8934. (Unicode:$1D49E; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL C
  8935. (Unicode:$1D49F; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL D
  8936. (Unicode:$1D4A2; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL G
  8937. (Unicode:$1D4A5; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL J
  8938. (Unicode:$1D4A6; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL K
  8939. (Unicode:$1D4A9; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL N
  8940. (Unicode:$1D4AA; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL O
  8941. (Unicode:$1D4AB; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL P
  8942. (Unicode:$1D4AC; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL Q
  8943. (Unicode:$1D4AE; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL S
  8944. (Unicode:$1D4AF; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL T
  8945. (Unicode:$1D4B0; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL U
  8946. (Unicode:$1D4B1; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL V
  8947. (Unicode:$1D4B2; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL W
  8948. (Unicode:$1D4B3; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL X
  8949. (Unicode:$1D4B4; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL Y
  8950. (Unicode:$1D4B5; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL SCRIPT CAPITAL Z
  8951. (Unicode:$1D4B6; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL A
  8952. (Unicode:$1D4B7; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL B
  8953. (Unicode:$1D4B8; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL C
  8954. (Unicode:$1D4B9; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL D
  8955. (Unicode:$1D4BB; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL F
  8956. (Unicode:$1D4BD; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL H
  8957. (Unicode:$1D4BE; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL I
  8958. (Unicode:$1D4BF; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL J
  8959. (Unicode:$1D4C0; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL K
  8960. (Unicode:$1D4C2; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL M
  8961. (Unicode:$1D4C3; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL N
  8962. (Unicode:$1D4C5; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL P
  8963. (Unicode:$1D4C6; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL Q
  8964. (Unicode:$1D4C7; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL R
  8965. (Unicode:$1D4C8; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL S
  8966. (Unicode:$1D4C9; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL T
  8967. (Unicode:$1D4CA; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL U
  8968. (Unicode:$1D4CB; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL V
  8969. (Unicode:$1D4CC; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL W
  8970. (Unicode:$1D4CD; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL X
  8971. (Unicode:$1D4CE; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL Y
  8972. (Unicode:$1D4CF; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL SCRIPT SMALL Z
  8973. (Unicode:$1D4D0; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL A
  8974. (Unicode:$1D4D1; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL B
  8975. (Unicode:$1D4D2; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL C
  8976. (Unicode:$1D4D3; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL D
  8977. (Unicode:$1D4D4; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL E
  8978. (Unicode:$1D4D5; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL F
  8979. (Unicode:$1D4D6; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL G
  8980. (Unicode:$1D4D7; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL H
  8981. (Unicode:$1D4D8; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL I
  8982. (Unicode:$1D4D9; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL J
  8983. (Unicode:$1D4DA; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL K
  8984. (Unicode:$1D4DB; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL L
  8985. (Unicode:$1D4DC; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL M
  8986. (Unicode:$1D4DD; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL N
  8987. (Unicode:$1D4DE; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL O
  8988. (Unicode:$1D4DF; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL P
  8989. (Unicode:$1D4E0; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL Q
  8990. (Unicode:$1D4E1; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL R
  8991. (Unicode:$1D4E2; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL S
  8992. (Unicode:$1D4E3; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL T
  8993. (Unicode:$1D4E4; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL U
  8994. (Unicode:$1D4E5; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL V
  8995. (Unicode:$1D4E6; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL W
  8996. (Unicode:$1D4E7; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL X
  8997. (Unicode:$1D4E8; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL Y
  8998. (Unicode:$1D4E9; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT CAPITAL Z
  8999. (Unicode:$1D4EA; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL A
  9000. (Unicode:$1D4EB; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL B
  9001. (Unicode:$1D4EC; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL C
  9002. (Unicode:$1D4ED; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL D
  9003. (Unicode:$1D4EE; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL E
  9004. (Unicode:$1D4EF; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL F
  9005. (Unicode:$1D4F0; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL G
  9006. (Unicode:$1D4F1; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL H
  9007. (Unicode:$1D4F2; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL I
  9008. (Unicode:$1D4F3; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL J
  9009. (Unicode:$1D4F4; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL K
  9010. (Unicode:$1D4F5; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL L
  9011. (Unicode:$1D4F6; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL M
  9012. (Unicode:$1D4F7; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL N
  9013. (Unicode:$1D4F8; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL O
  9014. (Unicode:$1D4F9; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL P
  9015. (Unicode:$1D4FA; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL Q
  9016. (Unicode:$1D4FB; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL R
  9017. (Unicode:$1D4FC; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL S
  9018. (Unicode:$1D4FD; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL T
  9019. (Unicode:$1D4FE; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL U
  9020. (Unicode:$1D4FF; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL V
  9021. (Unicode:$1D500; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL W
  9022. (Unicode:$1D501; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL X
  9023. (Unicode:$1D502; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL Y
  9024. (Unicode:$1D503; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL BOLD SCRIPT SMALL Z
  9025. (Unicode:$1D504; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL A
  9026. (Unicode:$1D505; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL B
  9027. (Unicode:$1D507; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL D
  9028. (Unicode:$1D508; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL E
  9029. (Unicode:$1D509; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL F
  9030. (Unicode:$1D50A; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL G
  9031. (Unicode:$1D50D; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL J
  9032. (Unicode:$1D50E; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL K
  9033. (Unicode:$1D50F; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL L
  9034. (Unicode:$1D510; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL M
  9035. (Unicode:$1D511; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL N
  9036. (Unicode:$1D512; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL O
  9037. (Unicode:$1D513; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL P
  9038. (Unicode:$1D514; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL Q
  9039. (Unicode:$1D516; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL S
  9040. (Unicode:$1D517; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL T
  9041. (Unicode:$1D518; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL U
  9042. (Unicode:$1D519; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL V
  9043. (Unicode:$1D51A; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL W
  9044. (Unicode:$1D51B; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL X
  9045. (Unicode:$1D51C; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR CAPITAL Y
  9046. (Unicode:$1D51E; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL A
  9047. (Unicode:$1D51F; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL B
  9048. (Unicode:$1D520; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL C
  9049. (Unicode:$1D521; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL D
  9050. (Unicode:$1D522; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL E
  9051. (Unicode:$1D523; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL F
  9052. (Unicode:$1D524; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL G
  9053. (Unicode:$1D525; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL H
  9054. (Unicode:$1D526; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL I
  9055. (Unicode:$1D527; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL J
  9056. (Unicode:$1D528; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL K
  9057. (Unicode:$1D529; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL L
  9058. (Unicode:$1D52A; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL M
  9059. (Unicode:$1D52B; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL N
  9060. (Unicode:$1D52C; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL O
  9061. (Unicode:$1D52D; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL P
  9062. (Unicode:$1D52E; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL Q
  9063. (Unicode:$1D52F; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL R
  9064. (Unicode:$1D530; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL S
  9065. (Unicode:$1D531; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL T
  9066. (Unicode:$1D532; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL U
  9067. (Unicode:$1D533; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL V
  9068. (Unicode:$1D534; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL W
  9069. (Unicode:$1D535; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL X
  9070. (Unicode:$1D536; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL Y
  9071. (Unicode:$1D537; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL FRAKTUR SMALL Z
  9072. (Unicode:$1D538; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL A
  9073. (Unicode:$1D539; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL B
  9074. (Unicode:$1D53B; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL D
  9075. (Unicode:$1D53C; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL E
  9076. (Unicode:$1D53D; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL F
  9077. (Unicode:$1D53E; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL G
  9078. (Unicode:$1D540; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL I
  9079. (Unicode:$1D541; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL J
  9080. (Unicode:$1D542; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL K
  9081. (Unicode:$1D543; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL L
  9082. (Unicode:$1D544; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL M
  9083. (Unicode:$1D546; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL O
  9084. (Unicode:$1D54A; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL S
  9085. (Unicode:$1D54B; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL T
  9086. (Unicode:$1D54C; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL U
  9087. (Unicode:$1D54D; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL V
  9088. (Unicode:$1D54E; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL W
  9089. (Unicode:$1D54F; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL X
  9090. (Unicode:$1D550; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
  9091. (Unicode:$1D552; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL A
  9092. (Unicode:$1D553; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL B
  9093. (Unicode:$1D554; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL C
  9094. (Unicode:$1D555; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL D
  9095. (Unicode:$1D556; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL E
  9096. (Unicode:$1D557; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL F
  9097. (Unicode:$1D558; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL G
  9098. (Unicode:$1D559; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL H
  9099. (Unicode:$1D55A; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL I
  9100. (Unicode:$1D55B; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL J
  9101. (Unicode:$1D55C; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL K
  9102. (Unicode:$1D55D; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL L
  9103. (Unicode:$1D55E; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL M
  9104. (Unicode:$1D55F; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL N
  9105. (Unicode:$1D560; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL O
  9106. (Unicode:$1D561; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL P
  9107. (Unicode:$1D562; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL Q
  9108. (Unicode:$1D563; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL R
  9109. (Unicode:$1D564; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL S
  9110. (Unicode:$1D565; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL T
  9111. (Unicode:$1D566; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL U
  9112. (Unicode:$1D567; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL V
  9113. (Unicode:$1D568; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL W
  9114. (Unicode:$1D569; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL X
  9115. (Unicode:$1D56A; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL Y
  9116. (Unicode:$1D56B; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK SMALL Z
  9117. (Unicode:$1D56C; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL A
  9118. (Unicode:$1D56D; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL B
  9119. (Unicode:$1D56E; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL C
  9120. (Unicode:$1D56F; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL D
  9121. (Unicode:$1D570; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL E
  9122. (Unicode:$1D571; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL F
  9123. (Unicode:$1D572; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL G
  9124. (Unicode:$1D573; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL H
  9125. (Unicode:$1D574; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL I
  9126. (Unicode:$1D575; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL J
  9127. (Unicode:$1D576; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL K
  9128. (Unicode:$1D577; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL L
  9129. (Unicode:$1D578; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL M
  9130. (Unicode:$1D579; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL N
  9131. (Unicode:$1D57A; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL O
  9132. (Unicode:$1D57B; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL P
  9133. (Unicode:$1D57C; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL Q
  9134. (Unicode:$1D57D; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL R
  9135. (Unicode:$1D57E; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL S
  9136. (Unicode:$1D57F; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL T
  9137. (Unicode:$1D580; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL U
  9138. (Unicode:$1D581; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL V
  9139. (Unicode:$1D582; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL W
  9140. (Unicode:$1D583; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL X
  9141. (Unicode:$1D584; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL Y
  9142. (Unicode:$1D585; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR CAPITAL Z
  9143. (Unicode:$1D586; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL A
  9144. (Unicode:$1D587; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL B
  9145. (Unicode:$1D588; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL C
  9146. (Unicode:$1D589; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL D
  9147. (Unicode:$1D58A; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL E
  9148. (Unicode:$1D58B; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL F
  9149. (Unicode:$1D58C; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL G
  9150. (Unicode:$1D58D; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL H
  9151. (Unicode:$1D58E; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL I
  9152. (Unicode:$1D58F; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL J
  9153. (Unicode:$1D590; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL K
  9154. (Unicode:$1D591; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL L
  9155. (Unicode:$1D592; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL M
  9156. (Unicode:$1D593; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL N
  9157. (Unicode:$1D594; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL O
  9158. (Unicode:$1D595; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL P
  9159. (Unicode:$1D596; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL Q
  9160. (Unicode:$1D597; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL R
  9161. (Unicode:$1D598; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL S
  9162. (Unicode:$1D599; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL T
  9163. (Unicode:$1D59A; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL U
  9164. (Unicode:$1D59B; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL V
  9165. (Unicode:$1D59C; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL W
  9166. (Unicode:$1D59D; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL X
  9167. (Unicode:$1D59E; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL Y
  9168. (Unicode:$1D59F; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL BOLD FRAKTUR SMALL Z
  9169. (Unicode:$1D5A0; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL A
  9170. (Unicode:$1D5A1; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL B
  9171. (Unicode:$1D5A2; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL C
  9172. (Unicode:$1D5A3; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL D
  9173. (Unicode:$1D5A4; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL E
  9174. (Unicode:$1D5A5; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL F
  9175. (Unicode:$1D5A6; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL G
  9176. (Unicode:$1D5A7; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL H
  9177. (Unicode:$1D5A8; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL I
  9178. (Unicode:$1D5A9; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL J
  9179. (Unicode:$1D5AA; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL K
  9180. (Unicode:$1D5AB; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL L
  9181. (Unicode:$1D5AC; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL M
  9182. (Unicode:$1D5AD; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL N
  9183. (Unicode:$1D5AE; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL O
  9184. (Unicode:$1D5AF; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL P
  9185. (Unicode:$1D5B0; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL Q
  9186. (Unicode:$1D5B1; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL R
  9187. (Unicode:$1D5B2; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL S
  9188. (Unicode:$1D5B3; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL T
  9189. (Unicode:$1D5B4; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL U
  9190. (Unicode:$1D5B5; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL V
  9191. (Unicode:$1D5B6; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL W
  9192. (Unicode:$1D5B7; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL X
  9193. (Unicode:$1D5B8; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL Y
  9194. (Unicode:$1D5B9; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF CAPITAL Z
  9195. (Unicode:$1D5BA; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL A
  9196. (Unicode:$1D5BB; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL B
  9197. (Unicode:$1D5BC; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL C
  9198. (Unicode:$1D5BD; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL D
  9199. (Unicode:$1D5BE; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL E
  9200. (Unicode:$1D5BF; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL F
  9201. (Unicode:$1D5C0; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL G
  9202. (Unicode:$1D5C1; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL H
  9203. (Unicode:$1D5C2; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL I
  9204. (Unicode:$1D5C3; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL J
  9205. (Unicode:$1D5C4; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL K
  9206. (Unicode:$1D5C5; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL L
  9207. (Unicode:$1D5C6; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL M
  9208. (Unicode:$1D5C7; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL N
  9209. (Unicode:$1D5C8; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL O
  9210. (Unicode:$1D5C9; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL P
  9211. (Unicode:$1D5CA; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL Q
  9212. (Unicode:$1D5CB; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL R
  9213. (Unicode:$1D5CC; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL S
  9214. (Unicode:$1D5CD; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL T
  9215. (Unicode:$1D5CE; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL U
  9216. (Unicode:$1D5CF; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL V
  9217. (Unicode:$1D5D0; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL W
  9218. (Unicode:$1D5D1; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL X
  9219. (Unicode:$1D5D2; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL Y
  9220. (Unicode:$1D5D3; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF SMALL Z
  9221. (Unicode:$1D5D4; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL A
  9222. (Unicode:$1D5D5; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL B
  9223. (Unicode:$1D5D6; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL C
  9224. (Unicode:$1D5D7; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL D
  9225. (Unicode:$1D5D8; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL E
  9226. (Unicode:$1D5D9; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL F
  9227. (Unicode:$1D5DA; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL G
  9228. (Unicode:$1D5DB; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL H
  9229. (Unicode:$1D5DC; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL I
  9230. (Unicode:$1D5DD; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL J
  9231. (Unicode:$1D5DE; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL K
  9232. (Unicode:$1D5DF; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL L
  9233. (Unicode:$1D5E0; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL M
  9234. (Unicode:$1D5E1; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL N
  9235. (Unicode:$1D5E2; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL O
  9236. (Unicode:$1D5E3; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL P
  9237. (Unicode:$1D5E4; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL Q
  9238. (Unicode:$1D5E5; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL R
  9239. (Unicode:$1D5E6; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL S
  9240. (Unicode:$1D5E7; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL T
  9241. (Unicode:$1D5E8; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL U
  9242. (Unicode:$1D5E9; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL V
  9243. (Unicode:$1D5EA; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL W
  9244. (Unicode:$1D5EB; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL X
  9245. (Unicode:$1D5EC; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL Y
  9246. (Unicode:$1D5ED; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL Z
  9247. (Unicode:$1D5EE; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL A
  9248. (Unicode:$1D5EF; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL B
  9249. (Unicode:$1D5F0; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL C
  9250. (Unicode:$1D5F1; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL D
  9251. (Unicode:$1D5F2; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL E
  9252. (Unicode:$1D5F3; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL F
  9253. (Unicode:$1D5F4; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL G
  9254. (Unicode:$1D5F5; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL H
  9255. (Unicode:$1D5F6; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL I
  9256. (Unicode:$1D5F7; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL J
  9257. (Unicode:$1D5F8; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL K
  9258. (Unicode:$1D5F9; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL L
  9259. (Unicode:$1D5FA; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL M
  9260. (Unicode:$1D5FB; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL N
  9261. (Unicode:$1D5FC; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL O
  9262. (Unicode:$1D5FD; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL P
  9263. (Unicode:$1D5FE; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL Q
  9264. (Unicode:$1D5FF; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL R
  9265. (Unicode:$1D600; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL S
  9266. (Unicode:$1D601; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL T
  9267. (Unicode:$1D602; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL U
  9268. (Unicode:$1D603; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL V
  9269. (Unicode:$1D604; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL W
  9270. (Unicode:$1D605; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL X
  9271. (Unicode:$1D606; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL Y
  9272. (Unicode:$1D607; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL Z
  9273. (Unicode:$1D608; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL A
  9274. (Unicode:$1D609; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL B
  9275. (Unicode:$1D60A; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL C
  9276. (Unicode:$1D60B; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL D
  9277. (Unicode:$1D60C; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL E
  9278. (Unicode:$1D60D; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL F
  9279. (Unicode:$1D60E; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL G
  9280. (Unicode:$1D60F; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL H
  9281. (Unicode:$1D610; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL I
  9282. (Unicode:$1D611; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL J
  9283. (Unicode:$1D612; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL K
  9284. (Unicode:$1D613; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL L
  9285. (Unicode:$1D614; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL M
  9286. (Unicode:$1D615; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL N
  9287. (Unicode:$1D616; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL O
  9288. (Unicode:$1D617; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL P
  9289. (Unicode:$1D618; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q
  9290. (Unicode:$1D619; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL R
  9291. (Unicode:$1D61A; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL S
  9292. (Unicode:$1D61B; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL T
  9293. (Unicode:$1D61C; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL U
  9294. (Unicode:$1D61D; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL V
  9295. (Unicode:$1D61E; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL W
  9296. (Unicode:$1D61F; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL X
  9297. (Unicode:$1D620; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y
  9298. (Unicode:$1D621; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z
  9299. (Unicode:$1D622; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL A
  9300. (Unicode:$1D623; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL B
  9301. (Unicode:$1D624; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL C
  9302. (Unicode:$1D625; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL D
  9303. (Unicode:$1D626; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL E
  9304. (Unicode:$1D627; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL F
  9305. (Unicode:$1D628; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL G
  9306. (Unicode:$1D629; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL H
  9307. (Unicode:$1D62A; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL I
  9308. (Unicode:$1D62B; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL J
  9309. (Unicode:$1D62C; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL K
  9310. (Unicode:$1D62D; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL L
  9311. (Unicode:$1D62E; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL M
  9312. (Unicode:$1D62F; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL N
  9313. (Unicode:$1D630; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL O
  9314. (Unicode:$1D631; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL P
  9315. (Unicode:$1D632; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL Q
  9316. (Unicode:$1D633; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL R
  9317. (Unicode:$1D634; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL S
  9318. (Unicode:$1D635; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL T
  9319. (Unicode:$1D636; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL U
  9320. (Unicode:$1D637; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL V
  9321. (Unicode:$1D638; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL W
  9322. (Unicode:$1D639; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL X
  9323. (Unicode:$1D63A; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL Y
  9324. (Unicode:$1D63B; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF ITALIC SMALL Z
  9325. (Unicode:$1D63C; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A
  9326. (Unicode:$1D63D; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B
  9327. (Unicode:$1D63E; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C
  9328. (Unicode:$1D63F; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D
  9329. (Unicode:$1D640; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E
  9330. (Unicode:$1D641; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F
  9331. (Unicode:$1D642; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G
  9332. (Unicode:$1D643; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H
  9333. (Unicode:$1D644; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I
  9334. (Unicode:$1D645; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J
  9335. (Unicode:$1D646; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K
  9336. (Unicode:$1D647; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L
  9337. (Unicode:$1D648; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M
  9338. (Unicode:$1D649; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N
  9339. (Unicode:$1D64A; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O
  9340. (Unicode:$1D64B; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P
  9341. (Unicode:$1D64C; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q
  9342. (Unicode:$1D64D; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R
  9343. (Unicode:$1D64E; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S
  9344. (Unicode:$1D64F; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T
  9345. (Unicode:$1D650; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U
  9346. (Unicode:$1D651; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V
  9347. (Unicode:$1D652; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W
  9348. (Unicode:$1D653; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X
  9349. (Unicode:$1D654; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y
  9350. (Unicode:$1D655; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z
  9351. (Unicode:$1D656; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A
  9352. (Unicode:$1D657; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B
  9353. (Unicode:$1D658; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C
  9354. (Unicode:$1D659; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D
  9355. (Unicode:$1D65A; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E
  9356. (Unicode:$1D65B; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F
  9357. (Unicode:$1D65C; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G
  9358. (Unicode:$1D65D; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H
  9359. (Unicode:$1D65E; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I
  9360. (Unicode:$1D65F; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
  9361. (Unicode:$1D660; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K
  9362. (Unicode:$1D661; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L
  9363. (Unicode:$1D662; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M
  9364. (Unicode:$1D663; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N
  9365. (Unicode:$1D664; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O
  9366. (Unicode:$1D665; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P
  9367. (Unicode:$1D666; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q
  9368. (Unicode:$1D667; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R
  9369. (Unicode:$1D668; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S
  9370. (Unicode:$1D669; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T
  9371. (Unicode:$1D66A; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U
  9372. (Unicode:$1D66B; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V
  9373. (Unicode:$1D66C; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W
  9374. (Unicode:$1D66D; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X
  9375. (Unicode:$1D66E; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y
  9376. (Unicode:$1D66F; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z
  9377. (Unicode:$1D670; Attr:daFont; Ch1:#$0041; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL A
  9378. (Unicode:$1D671; Attr:daFont; Ch1:#$0042; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL B
  9379. (Unicode:$1D672; Attr:daFont; Ch1:#$0043; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL C
  9380. (Unicode:$1D673; Attr:daFont; Ch1:#$0044; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL D
  9381. (Unicode:$1D674; Attr:daFont; Ch1:#$0045; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL E
  9382. (Unicode:$1D675; Attr:daFont; Ch1:#$0046; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL F
  9383. (Unicode:$1D676; Attr:daFont; Ch1:#$0047; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL G
  9384. (Unicode:$1D677; Attr:daFont; Ch1:#$0048; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL H
  9385. (Unicode:$1D678; Attr:daFont; Ch1:#$0049; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL I
  9386. (Unicode:$1D679; Attr:daFont; Ch1:#$004A; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL J
  9387. (Unicode:$1D67A; Attr:daFont; Ch1:#$004B; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL K
  9388. (Unicode:$1D67B; Attr:daFont; Ch1:#$004C; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL L
  9389. (Unicode:$1D67C; Attr:daFont; Ch1:#$004D; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL M
  9390. (Unicode:$1D67D; Attr:daFont; Ch1:#$004E; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL N
  9391. (Unicode:$1D67E; Attr:daFont; Ch1:#$004F; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL O
  9392. (Unicode:$1D67F; Attr:daFont; Ch1:#$0050; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL P
  9393. (Unicode:$1D680; Attr:daFont; Ch1:#$0051; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL Q
  9394. (Unicode:$1D681; Attr:daFont; Ch1:#$0052; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL R
  9395. (Unicode:$1D682; Attr:daFont; Ch1:#$0053; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL S
  9396. (Unicode:$1D683; Attr:daFont; Ch1:#$0054; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL T
  9397. (Unicode:$1D684; Attr:daFont; Ch1:#$0055; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL U
  9398. (Unicode:$1D685; Attr:daFont; Ch1:#$0056; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL V
  9399. (Unicode:$1D686; Attr:daFont; Ch1:#$0057; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL W
  9400. (Unicode:$1D687; Attr:daFont; Ch1:#$0058; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL X
  9401. (Unicode:$1D688; Attr:daFont; Ch1:#$0059; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL Y
  9402. (Unicode:$1D689; Attr:daFont; Ch1:#$005A; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE CAPITAL Z
  9403. (Unicode:$1D68A; Attr:daFont; Ch1:#$0061; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL A
  9404. (Unicode:$1D68B; Attr:daFont; Ch1:#$0062; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL B
  9405. (Unicode:$1D68C; Attr:daFont; Ch1:#$0063; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL C
  9406. (Unicode:$1D68D; Attr:daFont; Ch1:#$0064; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL D
  9407. (Unicode:$1D68E; Attr:daFont; Ch1:#$0065; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL E
  9408. (Unicode:$1D68F; Attr:daFont; Ch1:#$0066; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL F
  9409. (Unicode:$1D690; Attr:daFont; Ch1:#$0067; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL G
  9410. (Unicode:$1D691; Attr:daFont; Ch1:#$0068; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL H
  9411. (Unicode:$1D692; Attr:daFont; Ch1:#$0069; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL I
  9412. (Unicode:$1D693; Attr:daFont; Ch1:#$006A; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL J
  9413. (Unicode:$1D694; Attr:daFont; Ch1:#$006B; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL K
  9414. (Unicode:$1D695; Attr:daFont; Ch1:#$006C; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL L
  9415. (Unicode:$1D696; Attr:daFont; Ch1:#$006D; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL M
  9416. (Unicode:$1D697; Attr:daFont; Ch1:#$006E; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL N
  9417. (Unicode:$1D698; Attr:daFont; Ch1:#$006F; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL O
  9418. (Unicode:$1D699; Attr:daFont; Ch1:#$0070; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL P
  9419. (Unicode:$1D69A; Attr:daFont; Ch1:#$0071; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL Q
  9420. (Unicode:$1D69B; Attr:daFont; Ch1:#$0072; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL R
  9421. (Unicode:$1D69C; Attr:daFont; Ch1:#$0073; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL S
  9422. (Unicode:$1D69D; Attr:daFont; Ch1:#$0074; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL T
  9423. (Unicode:$1D69E; Attr:daFont; Ch1:#$0075; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL U
  9424. (Unicode:$1D69F; Attr:daFont; Ch1:#$0076; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL V
  9425. (Unicode:$1D6A0; Attr:daFont; Ch1:#$0077; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL W
  9426. (Unicode:$1D6A1; Attr:daFont; Ch1:#$0078; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL X
  9427. (Unicode:$1D6A2; Attr:daFont; Ch1:#$0079; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL Y
  9428. (Unicode:$1D6A3; Attr:daFont; Ch1:#$007A; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE SMALL Z
  9429. (Unicode:$1D6A8; Attr:daFont; Ch1:#$0391; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL ALPHA
  9430. (Unicode:$1D6A9; Attr:daFont; Ch1:#$0392; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL BETA
  9431. (Unicode:$1D6AA; Attr:daFont; Ch1:#$0393; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL GAMMA
  9432. (Unicode:$1D6AB; Attr:daFont; Ch1:#$0394; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL DELTA
  9433. (Unicode:$1D6AC; Attr:daFont; Ch1:#$0395; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL EPSILON
  9434. (Unicode:$1D6AD; Attr:daFont; Ch1:#$0396; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL ZETA
  9435. (Unicode:$1D6AE; Attr:daFont; Ch1:#$0397; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL ETA
  9436. (Unicode:$1D6AF; Attr:daFont; Ch1:#$0398; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL THETA
  9437. (Unicode:$1D6B0; Attr:daFont; Ch1:#$0399; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL IOTA
  9438. (Unicode:$1D6B1; Attr:daFont; Ch1:#$039A; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL KAPPA
  9439. (Unicode:$1D6B2; Attr:daFont; Ch1:#$039B; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL LAMDA
  9440. (Unicode:$1D6B3; Attr:daFont; Ch1:#$039C; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL MU
  9441. (Unicode:$1D6B4; Attr:daFont; Ch1:#$039D; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL NU
  9442. (Unicode:$1D6B5; Attr:daFont; Ch1:#$039E; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL XI
  9443. (Unicode:$1D6B6; Attr:daFont; Ch1:#$039F; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL OMICRON
  9444. (Unicode:$1D6B7; Attr:daFont; Ch1:#$03A0; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL PI
  9445. (Unicode:$1D6B8; Attr:daFont; Ch1:#$03A1; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL RHO
  9446. (Unicode:$1D6B9; Attr:daFont; Ch1:#$03F4; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL THETA SYMBOL
  9447. (Unicode:$1D6BA; Attr:daFont; Ch1:#$03A3; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL SIGMA
  9448. (Unicode:$1D6BB; Attr:daFont; Ch1:#$03A4; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL TAU
  9449. (Unicode:$1D6BC; Attr:daFont; Ch1:#$03A5; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL UPSILON
  9450. (Unicode:$1D6BD; Attr:daFont; Ch1:#$03A6; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL PHI
  9451. (Unicode:$1D6BE; Attr:daFont; Ch1:#$03A7; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL CHI
  9452. (Unicode:$1D6BF; Attr:daFont; Ch1:#$03A8; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL PSI
  9453. (Unicode:$1D6C0; Attr:daFont; Ch1:#$03A9; Ch2:#$FFFF), // MATHEMATICAL BOLD CAPITAL OMEGA
  9454. (Unicode:$1D6C1; Attr:daFont; Ch1:#$2207; Ch2:#$FFFF), // MATHEMATICAL BOLD NABLA
  9455. (Unicode:$1D6C2; Attr:daFont; Ch1:#$03B1; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL ALPHA
  9456. (Unicode:$1D6C3; Attr:daFont; Ch1:#$03B2; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL BETA
  9457. (Unicode:$1D6C4; Attr:daFont; Ch1:#$03B3; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL GAMMA
  9458. (Unicode:$1D6C5; Attr:daFont; Ch1:#$03B4; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL DELTA
  9459. (Unicode:$1D6C6; Attr:daFont; Ch1:#$03B5; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL EPSILON
  9460. (Unicode:$1D6C7; Attr:daFont; Ch1:#$03B6; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL ZETA
  9461. (Unicode:$1D6C8; Attr:daFont; Ch1:#$03B7; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL ETA
  9462. (Unicode:$1D6C9; Attr:daFont; Ch1:#$03B8; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL THETA
  9463. (Unicode:$1D6CA; Attr:daFont; Ch1:#$03B9; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL IOTA
  9464. (Unicode:$1D6CB; Attr:daFont; Ch1:#$03BA; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL KAPPA
  9465. (Unicode:$1D6CC; Attr:daFont; Ch1:#$03BB; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL LAMDA
  9466. (Unicode:$1D6CD; Attr:daFont; Ch1:#$03BC; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL MU
  9467. (Unicode:$1D6CE; Attr:daFont; Ch1:#$03BD; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL NU
  9468. (Unicode:$1D6CF; Attr:daFont; Ch1:#$03BE; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL XI
  9469. (Unicode:$1D6D0; Attr:daFont; Ch1:#$03BF; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL OMICRON
  9470. (Unicode:$1D6D1; Attr:daFont; Ch1:#$03C0; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL PI
  9471. (Unicode:$1D6D2; Attr:daFont; Ch1:#$03C1; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL RHO
  9472. (Unicode:$1D6D3; Attr:daFont; Ch1:#$03C2; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL FINAL SIGMA
  9473. (Unicode:$1D6D4; Attr:daFont; Ch1:#$03C3; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL SIGMA
  9474. (Unicode:$1D6D5; Attr:daFont; Ch1:#$03C4; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL TAU
  9475. (Unicode:$1D6D6; Attr:daFont; Ch1:#$03C5; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL UPSILON
  9476. (Unicode:$1D6D7; Attr:daFont; Ch1:#$03C6; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL PHI
  9477. (Unicode:$1D6D8; Attr:daFont; Ch1:#$03C7; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL CHI
  9478. (Unicode:$1D6D9; Attr:daFont; Ch1:#$03C8; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL PSI
  9479. (Unicode:$1D6DA; Attr:daFont; Ch1:#$03C9; Ch2:#$FFFF), // MATHEMATICAL BOLD SMALL OMEGA
  9480. (Unicode:$1D6DB; Attr:daFont; Ch1:#$2202; Ch2:#$FFFF), // MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
  9481. (Unicode:$1D6DC; Attr:daFont; Ch1:#$03F5; Ch2:#$FFFF), // MATHEMATICAL BOLD EPSILON SYMBOL
  9482. (Unicode:$1D6DD; Attr:daFont; Ch1:#$03D1; Ch2:#$FFFF), // MATHEMATICAL BOLD THETA SYMBOL
  9483. (Unicode:$1D6DE; Attr:daFont; Ch1:#$03F0; Ch2:#$FFFF), // MATHEMATICAL BOLD KAPPA SYMBOL
  9484. (Unicode:$1D6DF; Attr:daFont; Ch1:#$03D5; Ch2:#$FFFF), // MATHEMATICAL BOLD PHI SYMBOL
  9485. (Unicode:$1D6E0; Attr:daFont; Ch1:#$03F1; Ch2:#$FFFF), // MATHEMATICAL BOLD RHO SYMBOL
  9486. (Unicode:$1D6E1; Attr:daFont; Ch1:#$03D6; Ch2:#$FFFF), // MATHEMATICAL BOLD PI SYMBOL
  9487. (Unicode:$1D6E2; Attr:daFont; Ch1:#$0391; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL ALPHA
  9488. (Unicode:$1D6E3; Attr:daFont; Ch1:#$0392; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL BETA
  9489. (Unicode:$1D6E4; Attr:daFont; Ch1:#$0393; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL GAMMA
  9490. (Unicode:$1D6E5; Attr:daFont; Ch1:#$0394; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL DELTA
  9491. (Unicode:$1D6E6; Attr:daFont; Ch1:#$0395; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL EPSILON
  9492. (Unicode:$1D6E7; Attr:daFont; Ch1:#$0396; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL ZETA
  9493. (Unicode:$1D6E8; Attr:daFont; Ch1:#$0397; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL ETA
  9494. (Unicode:$1D6E9; Attr:daFont; Ch1:#$0398; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL THETA
  9495. (Unicode:$1D6EA; Attr:daFont; Ch1:#$0399; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL IOTA
  9496. (Unicode:$1D6EB; Attr:daFont; Ch1:#$039A; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL KAPPA
  9497. (Unicode:$1D6EC; Attr:daFont; Ch1:#$039B; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL LAMDA
  9498. (Unicode:$1D6ED; Attr:daFont; Ch1:#$039C; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL MU
  9499. (Unicode:$1D6EE; Attr:daFont; Ch1:#$039D; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL NU
  9500. (Unicode:$1D6EF; Attr:daFont; Ch1:#$039E; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL XI
  9501. (Unicode:$1D6F0; Attr:daFont; Ch1:#$039F; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL OMICRON
  9502. (Unicode:$1D6F1; Attr:daFont; Ch1:#$03A0; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL PI
  9503. (Unicode:$1D6F2; Attr:daFont; Ch1:#$03A1; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL RHO
  9504. (Unicode:$1D6F3; Attr:daFont; Ch1:#$03F4; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL THETA SYMBOL
  9505. (Unicode:$1D6F4; Attr:daFont; Ch1:#$03A3; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL SIGMA
  9506. (Unicode:$1D6F5; Attr:daFont; Ch1:#$03A4; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL TAU
  9507. (Unicode:$1D6F6; Attr:daFont; Ch1:#$03A5; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL UPSILON
  9508. (Unicode:$1D6F7; Attr:daFont; Ch1:#$03A6; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL PHI
  9509. (Unicode:$1D6F8; Attr:daFont; Ch1:#$03A7; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL CHI
  9510. (Unicode:$1D6F9; Attr:daFont; Ch1:#$03A8; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL PSI
  9511. (Unicode:$1D6FA; Attr:daFont; Ch1:#$03A9; Ch2:#$FFFF), // MATHEMATICAL ITALIC CAPITAL OMEGA
  9512. (Unicode:$1D6FB; Attr:daFont; Ch1:#$2207; Ch2:#$FFFF), // MATHEMATICAL ITALIC NABLA
  9513. (Unicode:$1D6FC; Attr:daFont; Ch1:#$03B1; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL ALPHA
  9514. (Unicode:$1D6FD; Attr:daFont; Ch1:#$03B2; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL BETA
  9515. (Unicode:$1D6FE; Attr:daFont; Ch1:#$03B3; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL GAMMA
  9516. (Unicode:$1D6FF; Attr:daFont; Ch1:#$03B4; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL DELTA
  9517. (Unicode:$1D700; Attr:daFont; Ch1:#$03B5; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL EPSILON
  9518. (Unicode:$1D701; Attr:daFont; Ch1:#$03B6; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL ZETA
  9519. (Unicode:$1D702; Attr:daFont; Ch1:#$03B7; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL ETA
  9520. (Unicode:$1D703; Attr:daFont; Ch1:#$03B8; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL THETA
  9521. (Unicode:$1D704; Attr:daFont; Ch1:#$03B9; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL IOTA
  9522. (Unicode:$1D705; Attr:daFont; Ch1:#$03BA; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL KAPPA
  9523. (Unicode:$1D706; Attr:daFont; Ch1:#$03BB; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL LAMDA
  9524. (Unicode:$1D707; Attr:daFont; Ch1:#$03BC; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL MU
  9525. (Unicode:$1D708; Attr:daFont; Ch1:#$03BD; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL NU
  9526. (Unicode:$1D709; Attr:daFont; Ch1:#$03BE; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL XI
  9527. (Unicode:$1D70A; Attr:daFont; Ch1:#$03BF; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL OMICRON
  9528. (Unicode:$1D70B; Attr:daFont; Ch1:#$03C0; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL PI
  9529. (Unicode:$1D70C; Attr:daFont; Ch1:#$03C1; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL RHO
  9530. (Unicode:$1D70D; Attr:daFont; Ch1:#$03C2; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL FINAL SIGMA
  9531. (Unicode:$1D70E; Attr:daFont; Ch1:#$03C3; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL SIGMA
  9532. (Unicode:$1D70F; Attr:daFont; Ch1:#$03C4; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL TAU
  9533. (Unicode:$1D710; Attr:daFont; Ch1:#$03C5; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL UPSILON
  9534. (Unicode:$1D711; Attr:daFont; Ch1:#$03C6; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL PHI
  9535. (Unicode:$1D712; Attr:daFont; Ch1:#$03C7; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL CHI
  9536. (Unicode:$1D713; Attr:daFont; Ch1:#$03C8; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL PSI
  9537. (Unicode:$1D714; Attr:daFont; Ch1:#$03C9; Ch2:#$FFFF), // MATHEMATICAL ITALIC SMALL OMEGA
  9538. (Unicode:$1D715; Attr:daFont; Ch1:#$2202; Ch2:#$FFFF), // MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
  9539. (Unicode:$1D716; Attr:daFont; Ch1:#$03F5; Ch2:#$FFFF), // MATHEMATICAL ITALIC EPSILON SYMBOL
  9540. (Unicode:$1D717; Attr:daFont; Ch1:#$03D1; Ch2:#$FFFF), // MATHEMATICAL ITALIC THETA SYMBOL
  9541. (Unicode:$1D718; Attr:daFont; Ch1:#$03F0; Ch2:#$FFFF), // MATHEMATICAL ITALIC KAPPA SYMBOL
  9542. (Unicode:$1D719; Attr:daFont; Ch1:#$03D5; Ch2:#$FFFF), // MATHEMATICAL ITALIC PHI SYMBOL
  9543. (Unicode:$1D71A; Attr:daFont; Ch1:#$03F1; Ch2:#$FFFF), // MATHEMATICAL ITALIC RHO SYMBOL
  9544. (Unicode:$1D71B; Attr:daFont; Ch1:#$03D6; Ch2:#$FFFF), // MATHEMATICAL ITALIC PI SYMBOL
  9545. (Unicode:$1D71C; Attr:daFont; Ch1:#$0391; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL ALPHA
  9546. (Unicode:$1D71D; Attr:daFont; Ch1:#$0392; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL BETA
  9547. (Unicode:$1D71E; Attr:daFont; Ch1:#$0393; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL GAMMA
  9548. (Unicode:$1D71F; Attr:daFont; Ch1:#$0394; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL DELTA
  9549. (Unicode:$1D720; Attr:daFont; Ch1:#$0395; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL EPSILON
  9550. (Unicode:$1D721; Attr:daFont; Ch1:#$0396; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL ZETA
  9551. (Unicode:$1D722; Attr:daFont; Ch1:#$0397; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL ETA
  9552. (Unicode:$1D723; Attr:daFont; Ch1:#$0398; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL THETA
  9553. (Unicode:$1D724; Attr:daFont; Ch1:#$0399; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL IOTA
  9554. (Unicode:$1D725; Attr:daFont; Ch1:#$039A; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL KAPPA
  9555. (Unicode:$1D726; Attr:daFont; Ch1:#$039B; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL LAMDA
  9556. (Unicode:$1D727; Attr:daFont; Ch1:#$039C; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL MU
  9557. (Unicode:$1D728; Attr:daFont; Ch1:#$039D; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL NU
  9558. (Unicode:$1D729; Attr:daFont; Ch1:#$039E; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL XI
  9559. (Unicode:$1D72A; Attr:daFont; Ch1:#$039F; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL OMICRON
  9560. (Unicode:$1D72B; Attr:daFont; Ch1:#$03A0; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL PI
  9561. (Unicode:$1D72C; Attr:daFont; Ch1:#$03A1; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL RHO
  9562. (Unicode:$1D72D; Attr:daFont; Ch1:#$03F4; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL
  9563. (Unicode:$1D72E; Attr:daFont; Ch1:#$03A3; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL SIGMA
  9564. (Unicode:$1D72F; Attr:daFont; Ch1:#$03A4; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL TAU
  9565. (Unicode:$1D730; Attr:daFont; Ch1:#$03A5; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL UPSILON
  9566. (Unicode:$1D731; Attr:daFont; Ch1:#$03A6; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL PHI
  9567. (Unicode:$1D732; Attr:daFont; Ch1:#$03A7; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL CHI
  9568. (Unicode:$1D733; Attr:daFont; Ch1:#$03A8; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL PSI
  9569. (Unicode:$1D734; Attr:daFont; Ch1:#$03A9; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
  9570. (Unicode:$1D735; Attr:daFont; Ch1:#$2207; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC NABLA
  9571. (Unicode:$1D736; Attr:daFont; Ch1:#$03B1; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL ALPHA
  9572. (Unicode:$1D737; Attr:daFont; Ch1:#$03B2; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL BETA
  9573. (Unicode:$1D738; Attr:daFont; Ch1:#$03B3; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL GAMMA
  9574. (Unicode:$1D739; Attr:daFont; Ch1:#$03B4; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL DELTA
  9575. (Unicode:$1D73A; Attr:daFont; Ch1:#$03B5; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL EPSILON
  9576. (Unicode:$1D73B; Attr:daFont; Ch1:#$03B6; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL ZETA
  9577. (Unicode:$1D73C; Attr:daFont; Ch1:#$03B7; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL ETA
  9578. (Unicode:$1D73D; Attr:daFont; Ch1:#$03B8; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL THETA
  9579. (Unicode:$1D73E; Attr:daFont; Ch1:#$03B9; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL IOTA
  9580. (Unicode:$1D73F; Attr:daFont; Ch1:#$03BA; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL KAPPA
  9581. (Unicode:$1D740; Attr:daFont; Ch1:#$03BB; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL LAMDA
  9582. (Unicode:$1D741; Attr:daFont; Ch1:#$03BC; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL MU
  9583. (Unicode:$1D742; Attr:daFont; Ch1:#$03BD; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL NU
  9584. (Unicode:$1D743; Attr:daFont; Ch1:#$03BE; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL XI
  9585. (Unicode:$1D744; Attr:daFont; Ch1:#$03BF; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL OMICRON
  9586. (Unicode:$1D745; Attr:daFont; Ch1:#$03C0; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL PI
  9587. (Unicode:$1D746; Attr:daFont; Ch1:#$03C1; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL RHO
  9588. (Unicode:$1D747; Attr:daFont; Ch1:#$03C2; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA
  9589. (Unicode:$1D748; Attr:daFont; Ch1:#$03C3; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL SIGMA
  9590. (Unicode:$1D749; Attr:daFont; Ch1:#$03C4; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL TAU
  9591. (Unicode:$1D74A; Attr:daFont; Ch1:#$03C5; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL UPSILON
  9592. (Unicode:$1D74B; Attr:daFont; Ch1:#$03C6; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL PHI
  9593. (Unicode:$1D74C; Attr:daFont; Ch1:#$03C7; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL CHI
  9594. (Unicode:$1D74D; Attr:daFont; Ch1:#$03C8; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL PSI
  9595. (Unicode:$1D74E; Attr:daFont; Ch1:#$03C9; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC SMALL OMEGA
  9596. (Unicode:$1D74F; Attr:daFont; Ch1:#$2202; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
  9597. (Unicode:$1D750; Attr:daFont; Ch1:#$03F5; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC EPSILON SYMBOL
  9598. (Unicode:$1D751; Attr:daFont; Ch1:#$03D1; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC THETA SYMBOL
  9599. (Unicode:$1D752; Attr:daFont; Ch1:#$03F0; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC KAPPA SYMBOL
  9600. (Unicode:$1D753; Attr:daFont; Ch1:#$03D5; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC PHI SYMBOL
  9601. (Unicode:$1D754; Attr:daFont; Ch1:#$03F1; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC RHO SYMBOL
  9602. (Unicode:$1D755; Attr:daFont; Ch1:#$03D6; Ch2:#$FFFF), // MATHEMATICAL BOLD ITALIC PI SYMBOL
  9603. (Unicode:$1D756; Attr:daFont; Ch1:#$0391; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA
  9604. (Unicode:$1D757; Attr:daFont; Ch1:#$0392; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA
  9605. (Unicode:$1D758; Attr:daFont; Ch1:#$0393; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA
  9606. (Unicode:$1D759; Attr:daFont; Ch1:#$0394; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA
  9607. (Unicode:$1D75A; Attr:daFont; Ch1:#$0395; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON
  9608. (Unicode:$1D75B; Attr:daFont; Ch1:#$0396; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA
  9609. (Unicode:$1D75C; Attr:daFont; Ch1:#$0397; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA
  9610. (Unicode:$1D75D; Attr:daFont; Ch1:#$0398; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA
  9611. (Unicode:$1D75E; Attr:daFont; Ch1:#$0399; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA
  9612. (Unicode:$1D75F; Attr:daFont; Ch1:#$039A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA
  9613. (Unicode:$1D760; Attr:daFont; Ch1:#$039B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA
  9614. (Unicode:$1D761; Attr:daFont; Ch1:#$039C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL MU
  9615. (Unicode:$1D762; Attr:daFont; Ch1:#$039D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL NU
  9616. (Unicode:$1D763; Attr:daFont; Ch1:#$039E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL XI
  9617. (Unicode:$1D764; Attr:daFont; Ch1:#$039F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON
  9618. (Unicode:$1D765; Attr:daFont; Ch1:#$03A0; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL PI
  9619. (Unicode:$1D766; Attr:daFont; Ch1:#$03A1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO
  9620. (Unicode:$1D767; Attr:daFont; Ch1:#$03F4; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL
  9621. (Unicode:$1D768; Attr:daFont; Ch1:#$03A3; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA
  9622. (Unicode:$1D769; Attr:daFont; Ch1:#$03A4; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU
  9623. (Unicode:$1D76A; Attr:daFont; Ch1:#$03A5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON
  9624. (Unicode:$1D76B; Attr:daFont; Ch1:#$03A6; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI
  9625. (Unicode:$1D76C; Attr:daFont; Ch1:#$03A7; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI
  9626. (Unicode:$1D76D; Attr:daFont; Ch1:#$03A8; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI
  9627. (Unicode:$1D76E; Attr:daFont; Ch1:#$03A9; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
  9628. (Unicode:$1D76F; Attr:daFont; Ch1:#$2207; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD NABLA
  9629. (Unicode:$1D770; Attr:daFont; Ch1:#$03B1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA
  9630. (Unicode:$1D771; Attr:daFont; Ch1:#$03B2; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL BETA
  9631. (Unicode:$1D772; Attr:daFont; Ch1:#$03B3; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA
  9632. (Unicode:$1D773; Attr:daFont; Ch1:#$03B4; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL DELTA
  9633. (Unicode:$1D774; Attr:daFont; Ch1:#$03B5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON
  9634. (Unicode:$1D775; Attr:daFont; Ch1:#$03B6; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL ZETA
  9635. (Unicode:$1D776; Attr:daFont; Ch1:#$03B7; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL ETA
  9636. (Unicode:$1D777; Attr:daFont; Ch1:#$03B8; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL THETA
  9637. (Unicode:$1D778; Attr:daFont; Ch1:#$03B9; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL IOTA
  9638. (Unicode:$1D779; Attr:daFont; Ch1:#$03BA; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA
  9639. (Unicode:$1D77A; Attr:daFont; Ch1:#$03BB; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA
  9640. (Unicode:$1D77B; Attr:daFont; Ch1:#$03BC; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL MU
  9641. (Unicode:$1D77C; Attr:daFont; Ch1:#$03BD; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL NU
  9642. (Unicode:$1D77D; Attr:daFont; Ch1:#$03BE; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL XI
  9643. (Unicode:$1D77E; Attr:daFont; Ch1:#$03BF; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON
  9644. (Unicode:$1D77F; Attr:daFont; Ch1:#$03C0; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL PI
  9645. (Unicode:$1D780; Attr:daFont; Ch1:#$03C1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL RHO
  9646. (Unicode:$1D781; Attr:daFont; Ch1:#$03C2; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA
  9647. (Unicode:$1D782; Attr:daFont; Ch1:#$03C3; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA
  9648. (Unicode:$1D783; Attr:daFont; Ch1:#$03C4; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL TAU
  9649. (Unicode:$1D784; Attr:daFont; Ch1:#$03C5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON
  9650. (Unicode:$1D785; Attr:daFont; Ch1:#$03C6; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL PHI
  9651. (Unicode:$1D786; Attr:daFont; Ch1:#$03C7; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL CHI
  9652. (Unicode:$1D787; Attr:daFont; Ch1:#$03C8; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL PSI
  9653. (Unicode:$1D788; Attr:daFont; Ch1:#$03C9; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
  9654. (Unicode:$1D789; Attr:daFont; Ch1:#$2202; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
  9655. (Unicode:$1D78A; Attr:daFont; Ch1:#$03F5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL
  9656. (Unicode:$1D78B; Attr:daFont; Ch1:#$03D1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL
  9657. (Unicode:$1D78C; Attr:daFont; Ch1:#$03F0; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL
  9658. (Unicode:$1D78D; Attr:daFont; Ch1:#$03D5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL
  9659. (Unicode:$1D78E; Attr:daFont; Ch1:#$03F1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL
  9660. (Unicode:$1D78F; Attr:daFont; Ch1:#$03D6; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD PI SYMBOL
  9661. (Unicode:$1D790; Attr:daFont; Ch1:#$0391; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA
  9662. (Unicode:$1D791; Attr:daFont; Ch1:#$0392; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA
  9663. (Unicode:$1D792; Attr:daFont; Ch1:#$0393; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA
  9664. (Unicode:$1D793; Attr:daFont; Ch1:#$0394; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA
  9665. (Unicode:$1D794; Attr:daFont; Ch1:#$0395; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON
  9666. (Unicode:$1D795; Attr:daFont; Ch1:#$0396; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA
  9667. (Unicode:$1D796; Attr:daFont; Ch1:#$0397; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA
  9668. (Unicode:$1D797; Attr:daFont; Ch1:#$0398; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA
  9669. (Unicode:$1D798; Attr:daFont; Ch1:#$0399; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA
  9670. (Unicode:$1D799; Attr:daFont; Ch1:#$039A; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA
  9671. (Unicode:$1D79A; Attr:daFont; Ch1:#$039B; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA
  9672. (Unicode:$1D79B; Attr:daFont; Ch1:#$039C; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU
  9673. (Unicode:$1D79C; Attr:daFont; Ch1:#$039D; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU
  9674. (Unicode:$1D79D; Attr:daFont; Ch1:#$039E; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI
  9675. (Unicode:$1D79E; Attr:daFont; Ch1:#$039F; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON
  9676. (Unicode:$1D79F; Attr:daFont; Ch1:#$03A0; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI
  9677. (Unicode:$1D7A0; Attr:daFont; Ch1:#$03A1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO
  9678. (Unicode:$1D7A1; Attr:daFont; Ch1:#$03F4; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL
  9679. (Unicode:$1D7A2; Attr:daFont; Ch1:#$03A3; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA
  9680. (Unicode:$1D7A3; Attr:daFont; Ch1:#$03A4; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU
  9681. (Unicode:$1D7A4; Attr:daFont; Ch1:#$03A5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON
  9682. (Unicode:$1D7A5; Attr:daFont; Ch1:#$03A6; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI
  9683. (Unicode:$1D7A6; Attr:daFont; Ch1:#$03A7; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI
  9684. (Unicode:$1D7A7; Attr:daFont; Ch1:#$03A8; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI
  9685. (Unicode:$1D7A8; Attr:daFont; Ch1:#$03A9; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
  9686. (Unicode:$1D7A9; Attr:daFont; Ch1:#$2207; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
  9687. (Unicode:$1D7AA; Attr:daFont; Ch1:#$03B1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA
  9688. (Unicode:$1D7AB; Attr:daFont; Ch1:#$03B2; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA
  9689. (Unicode:$1D7AC; Attr:daFont; Ch1:#$03B3; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA
  9690. (Unicode:$1D7AD; Attr:daFont; Ch1:#$03B4; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA
  9691. (Unicode:$1D7AE; Attr:daFont; Ch1:#$03B5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON
  9692. (Unicode:$1D7AF; Attr:daFont; Ch1:#$03B6; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA
  9693. (Unicode:$1D7B0; Attr:daFont; Ch1:#$03B7; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA
  9694. (Unicode:$1D7B1; Attr:daFont; Ch1:#$03B8; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA
  9695. (Unicode:$1D7B2; Attr:daFont; Ch1:#$03B9; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA
  9696. (Unicode:$1D7B3; Attr:daFont; Ch1:#$03BA; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA
  9697. (Unicode:$1D7B4; Attr:daFont; Ch1:#$03BB; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA
  9698. (Unicode:$1D7B5; Attr:daFont; Ch1:#$03BC; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU
  9699. (Unicode:$1D7B6; Attr:daFont; Ch1:#$03BD; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU
  9700. (Unicode:$1D7B7; Attr:daFont; Ch1:#$03BE; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI
  9701. (Unicode:$1D7B8; Attr:daFont; Ch1:#$03BF; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON
  9702. (Unicode:$1D7B9; Attr:daFont; Ch1:#$03C0; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI
  9703. (Unicode:$1D7BA; Attr:daFont; Ch1:#$03C1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO
  9704. (Unicode:$1D7BB; Attr:daFont; Ch1:#$03C2; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA
  9705. (Unicode:$1D7BC; Attr:daFont; Ch1:#$03C3; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA
  9706. (Unicode:$1D7BD; Attr:daFont; Ch1:#$03C4; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU
  9707. (Unicode:$1D7BE; Attr:daFont; Ch1:#$03C5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON
  9708. (Unicode:$1D7BF; Attr:daFont; Ch1:#$03C6; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI
  9709. (Unicode:$1D7C0; Attr:daFont; Ch1:#$03C7; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI
  9710. (Unicode:$1D7C1; Attr:daFont; Ch1:#$03C8; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI
  9711. (Unicode:$1D7C2; Attr:daFont; Ch1:#$03C9; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
  9712. (Unicode:$1D7C3; Attr:daFont; Ch1:#$2202; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
  9713. (Unicode:$1D7C4; Attr:daFont; Ch1:#$03F5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL
  9714. (Unicode:$1D7C5; Attr:daFont; Ch1:#$03D1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL
  9715. (Unicode:$1D7C6; Attr:daFont; Ch1:#$03F0; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL
  9716. (Unicode:$1D7C7; Attr:daFont; Ch1:#$03D5; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL
  9717. (Unicode:$1D7C8; Attr:daFont; Ch1:#$03F1; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL
  9718. (Unicode:$1D7C9; Attr:daFont; Ch1:#$03D6; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
  9719. (Unicode:$1D7CE; Attr:daFont; Ch1:#$0030; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT ZERO
  9720. (Unicode:$1D7CF; Attr:daFont; Ch1:#$0031; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT ONE
  9721. (Unicode:$1D7D0; Attr:daFont; Ch1:#$0032; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT TWO
  9722. (Unicode:$1D7D1; Attr:daFont; Ch1:#$0033; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT THREE
  9723. (Unicode:$1D7D2; Attr:daFont; Ch1:#$0034; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT FOUR
  9724. (Unicode:$1D7D3; Attr:daFont; Ch1:#$0035; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT FIVE
  9725. (Unicode:$1D7D4; Attr:daFont; Ch1:#$0036; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT SIX
  9726. (Unicode:$1D7D5; Attr:daFont; Ch1:#$0037; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT SEVEN
  9727. (Unicode:$1D7D6; Attr:daFont; Ch1:#$0038; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT EIGHT
  9728. (Unicode:$1D7D7; Attr:daFont; Ch1:#$0039; Ch2:#$FFFF), // MATHEMATICAL BOLD DIGIT NINE
  9729. (Unicode:$1D7D8; Attr:daFont; Ch1:#$0030; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO
  9730. (Unicode:$1D7D9; Attr:daFont; Ch1:#$0031; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
  9731. (Unicode:$1D7DA; Attr:daFont; Ch1:#$0032; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT TWO
  9732. (Unicode:$1D7DB; Attr:daFont; Ch1:#$0033; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT THREE
  9733. (Unicode:$1D7DC; Attr:daFont; Ch1:#$0034; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR
  9734. (Unicode:$1D7DD; Attr:daFont; Ch1:#$0035; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE
  9735. (Unicode:$1D7DE; Attr:daFont; Ch1:#$0036; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT SIX
  9736. (Unicode:$1D7DF; Attr:daFont; Ch1:#$0037; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN
  9737. (Unicode:$1D7E0; Attr:daFont; Ch1:#$0038; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT
  9738. (Unicode:$1D7E1; Attr:daFont; Ch1:#$0039; Ch2:#$FFFF), // MATHEMATICAL DOUBLE-STRUCK DIGIT NINE
  9739. (Unicode:$1D7E2; Attr:daFont; Ch1:#$0030; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT ZERO
  9740. (Unicode:$1D7E3; Attr:daFont; Ch1:#$0031; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT ONE
  9741. (Unicode:$1D7E4; Attr:daFont; Ch1:#$0032; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT TWO
  9742. (Unicode:$1D7E5; Attr:daFont; Ch1:#$0033; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT THREE
  9743. (Unicode:$1D7E6; Attr:daFont; Ch1:#$0034; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT FOUR
  9744. (Unicode:$1D7E7; Attr:daFont; Ch1:#$0035; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT FIVE
  9745. (Unicode:$1D7E8; Attr:daFont; Ch1:#$0036; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT SIX
  9746. (Unicode:$1D7E9; Attr:daFont; Ch1:#$0037; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT SEVEN
  9747. (Unicode:$1D7EA; Attr:daFont; Ch1:#$0038; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT EIGHT
  9748. (Unicode:$1D7EB; Attr:daFont; Ch1:#$0039; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF DIGIT NINE
  9749. (Unicode:$1D7EC; Attr:daFont; Ch1:#$0030; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO
  9750. (Unicode:$1D7ED; Attr:daFont; Ch1:#$0031; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT ONE
  9751. (Unicode:$1D7EE; Attr:daFont; Ch1:#$0032; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT TWO
  9752. (Unicode:$1D7EF; Attr:daFont; Ch1:#$0033; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT THREE
  9753. (Unicode:$1D7F0; Attr:daFont; Ch1:#$0034; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR
  9754. (Unicode:$1D7F1; Attr:daFont; Ch1:#$0035; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE
  9755. (Unicode:$1D7F2; Attr:daFont; Ch1:#$0036; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT SIX
  9756. (Unicode:$1D7F3; Attr:daFont; Ch1:#$0037; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN
  9757. (Unicode:$1D7F4; Attr:daFont; Ch1:#$0038; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT
  9758. (Unicode:$1D7F5; Attr:daFont; Ch1:#$0039; Ch2:#$FFFF), // MATHEMATICAL SANS-SERIF BOLD DIGIT NINE
  9759. (Unicode:$1D7F6; Attr:daFont; Ch1:#$0030; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT ZERO
  9760. (Unicode:$1D7F7; Attr:daFont; Ch1:#$0031; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT ONE
  9761. (Unicode:$1D7F8; Attr:daFont; Ch1:#$0032; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT TWO
  9762. (Unicode:$1D7F9; Attr:daFont; Ch1:#$0033; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT THREE
  9763. (Unicode:$1D7FA; Attr:daFont; Ch1:#$0034; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT FOUR
  9764. (Unicode:$1D7FB; Attr:daFont; Ch1:#$0035; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT FIVE
  9765. (Unicode:$1D7FC; Attr:daFont; Ch1:#$0036; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT SIX
  9766. (Unicode:$1D7FD; Attr:daFont; Ch1:#$0037; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT SEVEN
  9767. (Unicode:$1D7FE; Attr:daFont; Ch1:#$0038; Ch2:#$FFFF), // MATHEMATICAL MONOSPACE DIGIT EIGHT
  9768. (Unicode:$1D7FF; Attr:daFont; Ch1:#$0039; Ch2:#$FFFF) // MATHEMATICAL MONOSPACE DIGIT NINE
  9769. );
  9770. function LocateHighUCS4DecompositionInfoU(const Ch: UCS4Char): Integer;
  9771. var L, H, I : Integer;
  9772. D : UCS4Char;
  9773. begin
  9774. if (Ch < $1D000) or (Ch > $1D7FF) then
  9775. begin
  9776. Result := -1;
  9777. exit;
  9778. end;
  9779. // Binary search
  9780. L := 0;
  9781. H := UnicodeUCS4DecompositionEntries - 1;
  9782. repeat
  9783. I := (L + H) div 2;
  9784. D := UnicodeUCS4DecompositionInfo[I].Unicode;
  9785. if D = Ch then
  9786. begin
  9787. Result := I;
  9788. exit;
  9789. end else
  9790. if D > Ch then
  9791. H := I - 1 else
  9792. L := I + 1;
  9793. until L > H;
  9794. Result := -1;
  9795. end;
  9796. {$IFDEF CLR}
  9797. function GetCharacterDecompositionU(const Ch: UCS4Char): WideString;
  9798. var I : Integer;
  9799. P : TUnicodeUCS4DecompositionInfo;
  9800. begin
  9801. if Ch < $10000 then
  9802. Result := GetCharacterDecompositionU(WideChar(Ch))
  9803. else
  9804. begin
  9805. if Ch and $FFF00 = $1D100 then // UCS4 decompositions
  9806. begin
  9807. (*
  9808. (Unicode:$1D15E; Attr:daNone; Ch1:#$1D157; Ch2:#$1D165), // MUSICAL SYMBOL HALF NOTE
  9809. (Unicode:$1D15F; Attr:daNone; Ch1:#$1D158; Ch2:#$1D165), // MUSICAL SYMBOL QUARTER NOTE
  9810. (Unicode:$1D160; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D16E), // MUSICAL SYMBOL EIGHTH NOTE
  9811. (Unicode:$1D161; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D16F), // MUSICAL SYMBOL SIXTEENTH NOTE
  9812. (Unicode:$1D162; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D170), // MUSICAL SYMBOL THIRTY-SECOND NOTE
  9813. (Unicode:$1D163; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D171), // MUSICAL SYMBOL SIXTY-FOURTH NOTE
  9814. (Unicode:$1D164; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D172), // MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
  9815. (Unicode:$1D1BB; Attr:daNone; Ch1:#$1D1B9; Ch2:#$1D165), // MUSICAL SYMBOL MINIMA
  9816. (Unicode:$1D1BC; Attr:daNone; Ch1:#$1D1BA; Ch2:#$1D165), // MUSICAL SYMBOL MINIMA BLACK
  9817. (Unicode:$1D1BD; Attr:daNone; Ch1:#$1D1BB; Ch2:#$1D16E), // MUSICAL SYMBOL SEMIMINIMA WHITE
  9818. (Unicode:$1D1BE; Attr:daNone; Ch1:#$1D1BC; Ch2:#$1D16E), // MUSICAL SYMBOL SEMIMINIMA BLACK
  9819. (Unicode:$1D1BF; Attr:daNone; Ch1:#$1D1BB; Ch2:#$1D16F), // MUSICAL SYMBOL FUSA WHITE
  9820. (Unicode:$1D1C0; Attr:daNone; Ch1:#$1D1BC; Ch2:#$1D16F), // MUSICAL SYMBOL FUSA BLACK
  9821. *)
  9822. end;
  9823. I := LocateHighUCS4DecompositionInfoU(Ch);
  9824. if I < 0 then
  9825. Result := ''
  9826. else
  9827. begin
  9828. P := UnicodeUCS4DecompositionInfo[I];
  9829. if P.Ch2 = #$FFFF then
  9830. Result := P.Ch1
  9831. else
  9832. begin
  9833. SetLength(Result, 2);
  9834. Result[1] := P.Ch1;
  9835. Result[2] := P.Ch2;
  9836. end;
  9837. end;
  9838. end;
  9839. end;
  9840. {$ELSE}
  9841. function UnicodeGetCharacterDecompositionW(const Ch: UCS4Char): WideString;
  9842. var I : Integer;
  9843. P : PUnicodeUCS4DecompositionInfo;
  9844. begin
  9845. if Ch < $10000 then
  9846. Result := UnicodeGetCharacterDecompositionW(WideChar(Ch))
  9847. else
  9848. begin
  9849. if Ch and $FFF00 = $1D100 then // UCS4 decompositions
  9850. begin
  9851. (*
  9852. (Unicode:$1D15E; Attr:daNone; Ch1:#$1D157; Ch2:#$1D165), // MUSICAL SYMBOL HALF NOTE
  9853. (Unicode:$1D15F; Attr:daNone; Ch1:#$1D158; Ch2:#$1D165), // MUSICAL SYMBOL QUARTER NOTE
  9854. (Unicode:$1D160; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D16E), // MUSICAL SYMBOL EIGHTH NOTE
  9855. (Unicode:$1D161; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D16F), // MUSICAL SYMBOL SIXTEENTH NOTE
  9856. (Unicode:$1D162; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D170), // MUSICAL SYMBOL THIRTY-SECOND NOTE
  9857. (Unicode:$1D163; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D171), // MUSICAL SYMBOL SIXTY-FOURTH NOTE
  9858. (Unicode:$1D164; Attr:daNone; Ch1:#$1D15F; Ch2:#$1D172), // MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
  9859. (Unicode:$1D1BB; Attr:daNone; Ch1:#$1D1B9; Ch2:#$1D165), // MUSICAL SYMBOL MINIMA
  9860. (Unicode:$1D1BC; Attr:daNone; Ch1:#$1D1BA; Ch2:#$1D165), // MUSICAL SYMBOL MINIMA BLACK
  9861. (Unicode:$1D1BD; Attr:daNone; Ch1:#$1D1BB; Ch2:#$1D16E), // MUSICAL SYMBOL SEMIMINIMA WHITE
  9862. (Unicode:$1D1BE; Attr:daNone; Ch1:#$1D1BC; Ch2:#$1D16E), // MUSICAL SYMBOL SEMIMINIMA BLACK
  9863. (Unicode:$1D1BF; Attr:daNone; Ch1:#$1D1BB; Ch2:#$1D16F), // MUSICAL SYMBOL FUSA WHITE
  9864. (Unicode:$1D1C0; Attr:daNone; Ch1:#$1D1BC; Ch2:#$1D16F), // MUSICAL SYMBOL FUSA BLACK
  9865. *)
  9866. end;
  9867. I := LocateHighUCS4DecompositionInfoU(Ch);
  9868. if I < 0 then
  9869. Result := ''
  9870. else
  9871. begin
  9872. P := @UnicodeUCS4DecompositionInfo[I];
  9873. if P^.Ch2 = #$FFFF then
  9874. Result := P^.Ch1
  9875. else
  9876. begin
  9877. SetLength(Result, 2);
  9878. Result[1] := P^.Ch1;
  9879. Result[2] := P^.Ch2;
  9880. end;
  9881. end;
  9882. end;
  9883. end;
  9884. {$ENDIF}
  9885. function UnicodeUpperCaseW(const S: WideString): WideString;
  9886. var L, I : Integer;
  9887. begin
  9888. L := Length(S);
  9889. SetLength(Result, L);
  9890. for I := 1 to L do
  9891. Result[I] := UnicodeUpCase(S[I]);
  9892. end;
  9893. function UnicodeUpperCaseU(const S: UnicodeString): UnicodeString;
  9894. var L, I : Integer;
  9895. begin
  9896. L := Length(S);
  9897. SetLength(Result, L);
  9898. for I := 1 to L do
  9899. Result[I] := UnicodeUpCase(S[I]);
  9900. end;
  9901. function UnicodeLowerCaseW(const S: WideString): WideString;
  9902. var L, I : Integer;
  9903. begin
  9904. L := Length(S);
  9905. SetLength(Result, L);
  9906. for I := 1 to L do
  9907. Result[I] := UnicodeLowCase(S[I]);
  9908. end;
  9909. function UnicodeLowerCaseU(const S: UnicodeString): UnicodeString;
  9910. var L, I : Integer;
  9911. begin
  9912. L := Length(S);
  9913. SetLength(Result, L);
  9914. for I := 1 to L do
  9915. Result[I] := UnicodeLowCase(S[I]);
  9916. end;
  9917. function UnicodeUpperCaseFoldingW(const S: WideString): WideString;
  9918. var I : Integer;
  9919. begin
  9920. Result := '';
  9921. for I := 1 to Length(S) do
  9922. Result := Result + UnicodeUpCaseFoldingW(S[I]);
  9923. end;
  9924. function UnicodeUpperCaseFoldingU(const S: UnicodeString): UnicodeString;
  9925. var I : Integer;
  9926. begin
  9927. Result := '';
  9928. for I := 1 to Length(S) do
  9929. Result := Result + UnicodeUpCaseFoldingU(S[I]);
  9930. end;
  9931. function UnicodeLowerCaseFoldingW(const S: WideString): WideString;
  9932. var I : Integer;
  9933. begin
  9934. Result := '';
  9935. for I := 1 to Length(S) do
  9936. Result := Result + UnicodeLowCaseFoldingW(S[I]);
  9937. end;
  9938. function UnicodeLowerCaseFoldingU(const S: UnicodeString): UnicodeString;
  9939. var I : Integer;
  9940. begin
  9941. Result := '';
  9942. for I := 1 to Length(S) do
  9943. Result := Result + UnicodeLowCaseFoldingU(S[I]);
  9944. end;
  9945. { }
  9946. { String functions }
  9947. { }
  9948. {$IFDEF ManagedCode}
  9949. procedure SetLengthAndZeroA(var S: AnsiString; const NewLength: Integer);
  9950. var L, I : Integer;
  9951. begin
  9952. L := Length(S);
  9953. if L = NewLength then
  9954. exit;
  9955. SetLength(S, NewLength);
  9956. if L > NewLength then
  9957. exit;
  9958. for I := L + 1 to NewLength do
  9959. S[I] := AnsiChar(#0);
  9960. end;
  9961. {$ELSE}
  9962. procedure SetLengthAndZeroA(var S: AnsiString; const NewLength: Integer);
  9963. var L : Integer;
  9964. P : PAnsiChar;
  9965. begin
  9966. L := Length(S);
  9967. if L = NewLength then
  9968. exit;
  9969. SetLength(S, NewLength);
  9970. if L > NewLength then
  9971. exit;
  9972. P := Pointer(S);
  9973. Inc(P, L);
  9974. ZeroMem(P^, NewLength - L);
  9975. end;
  9976. {$ENDIF}
  9977. procedure SetLengthAndZeroW(var S: WideString; const NewLength: Integer);
  9978. var L : Integer;
  9979. P : PWideChar;
  9980. begin
  9981. L := Length(S);
  9982. if L = NewLength then
  9983. exit;
  9984. SetLength(S, NewLength);
  9985. if L > NewLength then
  9986. exit;
  9987. P := Pointer(S);
  9988. Inc(P, L);
  9989. ZeroMem(P^, (NewLength - L) * SizeOf(WideChar));
  9990. end;
  9991. procedure SetLengthAndZeroU(var S: UnicodeString; const NewLength: Integer);
  9992. var L : Integer;
  9993. P : PWideChar;
  9994. begin
  9995. L := Length(S);
  9996. if L = NewLength then
  9997. exit;
  9998. SetLength(S, NewLength);
  9999. if L > NewLength then
  10000. exit;
  10001. P := Pointer(S);
  10002. Inc(P, L);
  10003. ZeroMem(P^, (NewLength - L) * SizeOf(WideChar));
  10004. end;
  10005. {$IFNDEF ManagedCode}
  10006. function StrPasP(const Buf; const BufSize: Integer): AnsiString;
  10007. begin
  10008. if BufSize <= 0 then
  10009. Result := ''
  10010. else
  10011. begin
  10012. SetLength(Result, BufSize);
  10013. Move(Buf, Pointer(Result)^, BufSize);
  10014. end;
  10015. end;
  10016. {$ENDIF}
  10017. function StrLenA(const A: PAnsiChar): Integer;
  10018. var L : Integer;
  10019. begin
  10020. if not Assigned(A) then
  10021. begin
  10022. Result := 0;
  10023. exit;
  10024. end;
  10025. L := 0;
  10026. while A[L] <> #0 do
  10027. Inc(L);
  10028. Result := L;
  10029. end;
  10030. function StrPasA(const A: PAnsiChar): AnsiString;
  10031. var I, L : Integer;
  10032. begin
  10033. L := StrLenA(A);
  10034. SetLength(Result, L);
  10035. if L = 0 then
  10036. exit;
  10037. I := 0;
  10038. while I < L do
  10039. begin
  10040. Result[I + 1] := A[I];
  10041. Inc(I);
  10042. end;
  10043. end;
  10044. function StrLenW(const A: PWideChar): Integer;
  10045. var L : Integer;
  10046. begin
  10047. if not Assigned(A) then
  10048. begin
  10049. Result := 0;
  10050. exit;
  10051. end;
  10052. L := 0;
  10053. while A[L] <> #0 do
  10054. Inc(L);
  10055. Result := L;
  10056. end;
  10057. function StrPasW(const A: PWideChar): WideString;
  10058. var I, L : Integer;
  10059. begin
  10060. L := StrLenW(A);
  10061. SetLength(Result, L);
  10062. if L = 0 then
  10063. exit;
  10064. I := 0;
  10065. while I < L do
  10066. begin
  10067. Result[I + 1] := A[I];
  10068. Inc(I);
  10069. end;
  10070. end;
  10071. function StrPasU(const A: PWideChar): UnicodeString;
  10072. var I, L : Integer;
  10073. begin
  10074. L := StrLenW(A);
  10075. SetLength(Result, L);
  10076. if L = 0 then
  10077. exit;
  10078. I := 0;
  10079. while I < L do
  10080. begin
  10081. Result[I + 1] := A[I];
  10082. Inc(I);
  10083. end;
  10084. end;
  10085. function StringLen(const A: PChar): Integer;
  10086. var L : Integer;
  10087. begin
  10088. if not Assigned(A) then
  10089. begin
  10090. Result := 0;
  10091. exit;
  10092. end;
  10093. L := 0;
  10094. while A[L] <> #0 do
  10095. Inc(L);
  10096. Result := L;
  10097. end;
  10098. function StringPas(const A: PChar): String;
  10099. var I, L : Integer;
  10100. begin
  10101. L := StringLen(A);
  10102. SetLength(Result, L);
  10103. if L = 0 then
  10104. exit;
  10105. I := 0;
  10106. while I < L do
  10107. begin
  10108. Result[I + 1] := A[I];
  10109. Inc(I);
  10110. end;
  10111. end;
  10112. function ToStringChA(const A: AnsiChar): String;
  10113. begin
  10114. {$IFDEF StringIsUnicode}
  10115. Result := WideChar(A);
  10116. {$ELSE}
  10117. Result := A;
  10118. {$ENDIF}
  10119. end;
  10120. function ToStringChW(const A: WideChar): String;
  10121. begin
  10122. {$IFDEF StringIsUnicode}
  10123. Result := A;
  10124. {$ELSE}
  10125. if Ord(A) <= $FF then
  10126. Result := AnsiChar(Ord(A))
  10127. else
  10128. raise EConvertError.Create('Invalid character');
  10129. {$ENDIF}
  10130. end;
  10131. function ToStringA(const A: AnsiString): String;
  10132. begin
  10133. {$IFDEF StringIsUnicode}
  10134. Result := String(A);
  10135. {$ELSE}
  10136. Result := A;
  10137. {$ENDIF}
  10138. end;
  10139. function ToStringW(const A: WideString): String;
  10140. begin
  10141. {$IFDEF StringIsUnicode}
  10142. Result := String(A);
  10143. {$ELSE}
  10144. Result := AnsiString(A);
  10145. {$ENDIF}
  10146. end;
  10147. function ToStringU(const A: UnicodeString): String;
  10148. begin
  10149. {$IFDEF StringIsUnicode}
  10150. Result := String(A);
  10151. {$ELSE}
  10152. Result := AnsiString(A);
  10153. {$ENDIF}
  10154. end;
  10155. function ToAnsiString(const A: String): AnsiString;
  10156. begin
  10157. {$IFDEF StringIsUnicode}
  10158. Result := AnsiString(A);
  10159. {$ELSE}
  10160. Result := A;
  10161. {$ENDIF}
  10162. end;
  10163. function ToWideString(const A: String): WideString;
  10164. begin
  10165. Result := WideString(A);
  10166. end;
  10167. function ToUnicodeString(const A: String): UnicodeString;
  10168. begin
  10169. Result := UnicodeString(A);
  10170. end;
  10171. {$IFNDEF ManagedCode}
  10172. function StrZLenA(const S: PAnsiChar): Integer;
  10173. var P : PAnsiChar;
  10174. begin
  10175. if not Assigned(S) then
  10176. Result := 0
  10177. else
  10178. begin
  10179. Result := 0;
  10180. P := S;
  10181. while P^ <> #0 do
  10182. begin
  10183. Inc(Result);
  10184. Inc(P);
  10185. end;
  10186. end;
  10187. end;
  10188. function StrZLenW(const S: PWideChar): Integer;
  10189. var P : PWideChar;
  10190. begin
  10191. if not Assigned(S) then
  10192. Result := 0
  10193. else
  10194. begin
  10195. Result := 0;
  10196. P := S;
  10197. while P^ <> #0 do
  10198. begin
  10199. Inc(Result);
  10200. Inc(P);
  10201. end;
  10202. end;
  10203. end;
  10204. function StrZLen(const S: PChar): Integer;
  10205. var P : PChar;
  10206. begin
  10207. if not Assigned(S) then
  10208. Result := 0
  10209. else
  10210. begin
  10211. Result := 0;
  10212. P := S;
  10213. while P^ <> #0 do
  10214. begin
  10215. Inc(Result);
  10216. Inc(P);
  10217. end;
  10218. end;
  10219. end;
  10220. function StrPToStrA(const P: PAnsiChar; const L: Integer): AnsiString;
  10221. begin
  10222. Assert(L >= 0);
  10223. SetLength(Result, L);
  10224. if L > 0 then
  10225. MoveMem(P^, Pointer(Result)^, L);
  10226. end;
  10227. function StrPToStrW(const P: PWideChar; const L: Integer): WideString;
  10228. begin
  10229. Assert(L >= 0);
  10230. SetLength(Result, L);
  10231. if L > 0 then
  10232. MoveMem(P^, Pointer(Result)^, L * SizeOf(WideChar));
  10233. end;
  10234. function StrPToStrU(const P: PWideChar; const L: Integer): UnicodeString;
  10235. begin
  10236. Assert(L >= 0);
  10237. SetLength(Result, L);
  10238. if L > 0 then
  10239. MoveMem(P^, Pointer(Result)^, L * SizeOf(WideChar));
  10240. end;
  10241. function StrPToStr(const P: PChar; const L: Integer): String;
  10242. begin
  10243. Assert(L >= 0);
  10244. SetLength(Result, L);
  10245. if L > 0 then
  10246. MoveMem(P^, Pointer(Result)^, L * SizeOf(Char));
  10247. end;
  10248. {$ENDIF}
  10249. { }
  10250. { ASCII case conversion }
  10251. { }
  10252. const
  10253. AsciiCaseDiff = Byte(AsciiLowerA) - Byte(AsciiUpperA);
  10254. {$IFDEF ASM386_DELPHI}
  10255. function AsciiLowCaseA(const C: AnsiChar): AnsiChar; register; assembler;
  10256. asm
  10257. CMP AL, AsciiUpperA
  10258. JB @@exit
  10259. CMP AL, AsciiUpperZ
  10260. JA @@exit
  10261. ADD AL, AsciiCaseDiff
  10262. @@exit:
  10263. end;
  10264. {$ELSE}
  10265. function AsciiLowCaseA(const C: AnsiChar): AnsiChar;
  10266. begin
  10267. if C in [AsciiUpperA..AsciiUpperZ] then
  10268. Result := AsciiChar(Byte(C) + AsciiCaseDiff)
  10269. else
  10270. Result := C;
  10271. end;
  10272. {$ENDIF}
  10273. function AsciiLowCaseW(const C: WideChar): WideChar;
  10274. begin
  10275. case Ord(C) of
  10276. Ord(AsciiUpperA)..Ord(AsciiUpperZ) : Result := WideChar(Ord(C) + AsciiCaseDiff)
  10277. else
  10278. Result := C;
  10279. end;
  10280. end;
  10281. function AsciiLowCase(const C: Char): Char;
  10282. begin
  10283. case Ord(C) of
  10284. Ord(AsciiUpperA)..Ord(AsciiUpperZ) : Result := Char(Ord(C) + AsciiCaseDiff)
  10285. else
  10286. Result := C;
  10287. end;
  10288. end;
  10289. {$IFDEF ASM386_DELPHI}
  10290. function AsciiUpCaseA(const C: AnsiChar): AnsiChar; register; assembler;
  10291. asm
  10292. CMP AL, AsciiLowerA
  10293. JB @@exit
  10294. CMP AL, AsciiLowerZ
  10295. JA @@exit
  10296. SUB AL, AsciiLowerA - AsciiUpperA
  10297. @@exit:
  10298. end;
  10299. {$ELSE}
  10300. function AsciiUpCaseA(const C: AnsiChar): AnsiChar;
  10301. begin
  10302. if C in [AsciiLowerA..AsciiLowerZ] then
  10303. Result := AsciiChar(Byte(C) - AsciiCaseDiff)
  10304. else
  10305. Result := C;
  10306. end;
  10307. {$ENDIF}
  10308. function AsciiUpCaseW(const C: WideChar): WideChar;
  10309. begin
  10310. case Ord(C) of
  10311. Ord(AsciiLowerA)..Ord(AsciiLowerZ) : Result := WideChar(Ord(C) - AsciiCaseDiff)
  10312. else
  10313. Result := C;
  10314. end;
  10315. end;
  10316. function AsciiUpCase(const C: Char): Char;
  10317. begin
  10318. case Ord(C) of
  10319. Ord(AsciiLowerA)..Ord(AsciiLowerZ) : Result := Char(Ord(C) - AsciiCaseDiff)
  10320. else
  10321. Result := C;
  10322. end;
  10323. end;
  10324. {$IFDEF ASM386_DELPHI}
  10325. procedure AsciiConvertUpperA(var S: AnsiString);
  10326. asm
  10327. OR EAX, EAX
  10328. JZ @Exit
  10329. PUSH EAX
  10330. MOV EAX, [EAX]
  10331. OR EAX, EAX
  10332. JZ @ExitP
  10333. MOV ECX, [EAX - 4]
  10334. OR ECX, ECX
  10335. JZ @ExitP
  10336. XOR DH, DH
  10337. @L2:
  10338. DEC ECX
  10339. MOV DL, [EAX + ECX]
  10340. CMP DL, AsciiLowerA
  10341. JB @L1
  10342. CMP DL, AsciiLowerZ
  10343. JA @L1
  10344. OR DH, DH
  10345. JZ @Uniq
  10346. @L3:
  10347. SUB DL, AsciiCaseDiff
  10348. MOV [EAX + ECX], DL
  10349. @L1:
  10350. OR ECX, ECX
  10351. JNZ @L2
  10352. OR DH, DH
  10353. JNZ @Exit
  10354. @ExitP:
  10355. POP EAX
  10356. @Exit:
  10357. RET
  10358. @Uniq:
  10359. POP EAX
  10360. PUSH ECX
  10361. PUSH EDX
  10362. CALL UniqueString
  10363. POP EDX
  10364. POP ECX
  10365. MOV DH, 1
  10366. JMP @L3
  10367. end;
  10368. {$ELSE}
  10369. procedure AsciiConvertUpperA(var S: AnsiString);
  10370. var F : Integer;
  10371. begin
  10372. for F := 1 to Length(S) do
  10373. if S[F] in [AsciiLowerA..AsciiLowerZ] then
  10374. S[F] := AnsiChar(Ord(S[F]) - AsciiCaseDiff);
  10375. end;
  10376. {$ENDIF}
  10377. procedure AsciiConvertUpperW(var S: WideString);
  10378. var F : Integer;
  10379. C : WideChar;
  10380. begin
  10381. for F := 1 to Length(S) do
  10382. begin
  10383. C := S[F];
  10384. if Ord(C) <= $FF then
  10385. if AnsiChar(Ord(C)) in [AsciiLowerA..AsciiLowerZ] then
  10386. S[F] := WideChar(Ord(C) - AsciiCaseDiff);
  10387. end;
  10388. end;
  10389. procedure AsciiConvertUpperU(var S: UnicodeString);
  10390. var F : Integer;
  10391. C : WideChar;
  10392. begin
  10393. for F := 1 to Length(S) do
  10394. begin
  10395. C := S[F];
  10396. if Ord(C) <= $FF then
  10397. if AnsiChar(Ord(C)) in [AsciiLowerA..AsciiLowerZ] then
  10398. S[F] := WideChar(Ord(C) - AsciiCaseDiff);
  10399. end;
  10400. end;
  10401. procedure AsciiConvertUpper(var S: String);
  10402. var F : Integer;
  10403. C : Char;
  10404. begin
  10405. for F := 1 to Length(S) do
  10406. begin
  10407. C := S[F];
  10408. {$IFDEF StringIsUnicode}
  10409. if Ord(C) <= $FF then
  10410. {$ENDIF}
  10411. if AnsiChar(Ord(C)) in [AsciiLowerA..AsciiLowerZ] then
  10412. S[F] := Char(Ord(C) - AsciiCaseDiff);
  10413. end;
  10414. end;
  10415. {$IFDEF ASM386_DELPHI}
  10416. procedure AsciiConvertLowerA(var S: AsciiString);
  10417. asm
  10418. OR EAX, EAX
  10419. JZ @Exit
  10420. PUSH EAX
  10421. MOV EAX, [EAX]
  10422. OR EAX, EAX
  10423. JZ @ExitP
  10424. MOV ECX, [EAX - 4]
  10425. OR ECX, ECX
  10426. JZ @ExitP
  10427. XOR DH, DH
  10428. @L2:
  10429. DEC ECX
  10430. MOV DL, [EAX + ECX]
  10431. CMP DL, AsciiUpperA
  10432. JB @L1
  10433. CMP DL, AsciiUpperZ
  10434. JA @L1
  10435. OR DH, DH
  10436. JZ @Uniq
  10437. @L3:
  10438. ADD DL, AsciiCaseDiff
  10439. MOV [EAX + ECX], DL
  10440. @L1:
  10441. OR ECX, ECX
  10442. JNZ @L2
  10443. OR DH, DH
  10444. JNZ @Exit
  10445. @ExitP:
  10446. POP EAX
  10447. @Exit:
  10448. RET
  10449. @Uniq:
  10450. POP EAX
  10451. PUSH ECX
  10452. PUSH EDX
  10453. CALL UniqueString
  10454. POP EDX
  10455. POP ECX
  10456. MOV DH, 1
  10457. JMP @L3
  10458. end;
  10459. {$ELSE}
  10460. procedure AsciiConvertLowerA(var S: AnsiString);
  10461. var F : Integer;
  10462. begin
  10463. for F := 1 to Length(S) do
  10464. if S[F] in [AsciiUpperA..AsciiUpperZ] then
  10465. S[F] := AnsiChar(Ord(S[F]) + AsciiCaseDiff);
  10466. end;
  10467. {$ENDIF}
  10468. procedure AsciiConvertLowerW(var S: WideString);
  10469. var F : Integer;
  10470. C : WideChar;
  10471. begin
  10472. for F := 1 to Length(S) do
  10473. begin
  10474. C := S[F];
  10475. if Ord(C) <= $FF then
  10476. if AnsiChar(Ord(C)) in [AsciiUpperA..AsciiUpperZ] then
  10477. S[F] := WideChar(Ord(C) + AsciiCaseDiff);
  10478. end;
  10479. end;
  10480. procedure AsciiConvertLowerU(var S: UnicodeString);
  10481. var F : Integer;
  10482. C : WideChar;
  10483. begin
  10484. for F := 1 to Length(S) do
  10485. begin
  10486. C := S[F];
  10487. if Ord(C) <= $FF then
  10488. if AnsiChar(Ord(C)) in [AsciiUpperA..AsciiUpperZ] then
  10489. S[F] := WideChar(Ord(C) + AsciiCaseDiff);
  10490. end;
  10491. end;
  10492. procedure AsciiConvertLower(var S: String);
  10493. var F : Integer;
  10494. C : Char;
  10495. begin
  10496. for F := 1 to Length(S) do
  10497. begin
  10498. C := S[F];
  10499. {$IFDEF StringIsUnicode}
  10500. if Ord(C) <= $FF then
  10501. {$ENDIF}
  10502. if AnsiChar(Ord(C)) in [AsciiUpperA..AsciiUpperZ] then
  10503. S[F] := Char(Ord(C) + AsciiCaseDiff);
  10504. end;
  10505. end;
  10506. procedure AsciiConvertFirstUpA(var S: AnsiString);
  10507. var C : AnsiChar;
  10508. begin
  10509. if S <> '' then
  10510. begin
  10511. C := S[1];
  10512. if C in [AsciiLowerA..AsciiLowerZ] then
  10513. S[1] := AsciiUpCaseA(C);
  10514. end;
  10515. end;
  10516. procedure AsciiConvertFirstUpW(var S: WideString);
  10517. var C : WideChar;
  10518. begin
  10519. if S <> '' then
  10520. begin
  10521. C := S[1];
  10522. if (C >= AsciiLowerA) and (C <= AsciiLowerZ) then
  10523. S[1] := AsciiUpCaseW(C);
  10524. end;
  10525. end;
  10526. procedure AsciiConvertFirstUp(var S: String);
  10527. var C : Char;
  10528. begin
  10529. if S <> '' then
  10530. begin
  10531. C := S[1];
  10532. if (C >= AsciiLowerA) and (C <= AsciiLowerZ) then
  10533. S[1] := AsciiUpCase(C);
  10534. end;
  10535. end;
  10536. function AsciiFirstUpA(const S: AnsiString): AnsiString;
  10537. begin
  10538. Result := S;
  10539. AsciiConvertFirstUpA(Result);
  10540. end;
  10541. function AsciiFirstUpW(const S: WideString): WideString;
  10542. begin
  10543. Result := S;
  10544. AsciiConvertFirstUpW(Result);
  10545. end;
  10546. function AsciiFirstUp(const S: String): String;
  10547. begin
  10548. Result := S;
  10549. AsciiConvertFirstUp(Result);
  10550. end;
  10551. procedure AsciiConvertArrayUpper(var S: AsciiStringArray);
  10552. var I : Integer;
  10553. begin
  10554. for I := 0 to Length(S) - 1 do
  10555. AsciiConvertUpperA(S[I]);
  10556. end;
  10557. procedure AsciiConvertArrayLower(var S: AsciiStringArray);
  10558. var I : Integer;
  10559. begin
  10560. for I := 0 to Length(S) - 1 do
  10561. AsciiConvertLowerA(S[I]);
  10562. end;
  10563. { }
  10564. { ASCII string }
  10565. { }
  10566. function IsAsciiCharA(const C: AnsiChar): Boolean;
  10567. begin
  10568. Result := C in [#0..#127];
  10569. end;
  10570. function IsAsciiCharW(const C: WideChar): Boolean;
  10571. begin
  10572. Result := Ord(C) <= 127;
  10573. end;
  10574. function IsAsciiChar(const C: Char): Boolean;
  10575. begin
  10576. Result := Ord(C) <= 127;
  10577. end;
  10578. function IsAsciiStringA(const S: AnsiString): Boolean;
  10579. var I : Integer;
  10580. begin
  10581. for I := 1 to Length(S) do
  10582. if not IsAsciiCharA(S[I]) then
  10583. begin
  10584. Result := False;
  10585. exit;
  10586. end;
  10587. Result := True;
  10588. end;
  10589. function IsAsciiStringW(const S: WideString): Boolean;
  10590. var I : Integer;
  10591. begin
  10592. for I := 1 to Length(S) do
  10593. if not IsAsciiCharW(S[I]) then
  10594. begin
  10595. Result := False;
  10596. exit;
  10597. end;
  10598. Result := True;
  10599. end;
  10600. function IsAsciiStringU(const S: UnicodeString): Boolean;
  10601. var I : Integer;
  10602. begin
  10603. for I := 1 to Length(S) do
  10604. if not IsAsciiCharW(S[I]) then
  10605. begin
  10606. Result := False;
  10607. exit;
  10608. end;
  10609. Result := True;
  10610. end;
  10611. function IsAsciiString(const S: String): Boolean;
  10612. var I : Integer;
  10613. begin
  10614. for I := 1 to Length(S) do
  10615. if not IsAsciiChar(S[I]) then
  10616. begin
  10617. Result := False;
  10618. exit;
  10619. end;
  10620. Result := True;
  10621. end;
  10622. { }
  10623. { ASCII functions }
  10624. { }
  10625. function AsciiHexCharValue(const C: AnsiChar): Integer;
  10626. begin
  10627. case C of
  10628. '0'..'9' : Result := Ord(C) - Ord('0');
  10629. 'A'..'F' : Result := Ord(C) - Ord('A') + 10;
  10630. 'a'..'f' : Result := Ord(C) - Ord('a') + 10;
  10631. else
  10632. Result := -1;
  10633. end;
  10634. end;
  10635. function AsciiHexCharValueW(const C: WideChar): Integer;
  10636. begin
  10637. if Ord(C) >= $80 then
  10638. Result := -1
  10639. else
  10640. Result := AsciiHexCharValue(AnsiChar(Ord(C)));
  10641. end;
  10642. function AsciiIsHexChar(const C: AnsiChar): Boolean;
  10643. begin
  10644. Result := AsciiHexCharValue(C) >= 0;
  10645. end;
  10646. function AsciiIsHexCharW(const C: WideChar): Boolean;
  10647. begin
  10648. Result := AsciiHexCharValueW(C) >= 0;
  10649. end;
  10650. function AsciiDecimalCharValue(const C: AnsiChar): Integer;
  10651. begin
  10652. case C of
  10653. '0'..'9' : Result := Ord(C) - Ord('0');
  10654. else
  10655. Result := -1;
  10656. end;
  10657. end;
  10658. function AsciiDecimalCharValueW(const C: WideChar): Integer;
  10659. begin
  10660. if Ord(C) >= $80 then
  10661. Result := -1
  10662. else
  10663. Result := AsciiDecimalCharValue(AnsiChar(Ord(C)));
  10664. end;
  10665. function AsciiIsDecimalChar(const C: AnsiChar): Boolean;
  10666. begin
  10667. Result := AsciiDecimalCharValue(C) >= 0;
  10668. end;
  10669. function AsciiIsDecimalCharW(const C: WideChar): Boolean;
  10670. begin
  10671. Result := AsciiDecimalCharValueW(C) >= 0;
  10672. end;
  10673. function AsciiOctalCharValue(const C: AnsiChar): Integer;
  10674. begin
  10675. case C of
  10676. '0'..'7' : Result := Ord(C) - Ord('0');
  10677. else
  10678. Result := -1;
  10679. end;
  10680. end;
  10681. function AsciiOctalCharValueW(const C: WideChar): Integer;
  10682. begin
  10683. if Ord(C) >= $80 then
  10684. Result := -1
  10685. else
  10686. Result := AsciiOctalCharValue(AnsiChar(Ord(C)));
  10687. end;
  10688. function AsciiIsOctalChar(const C: AnsiChar): Boolean;
  10689. begin
  10690. Result := AsciiOctalCharValue(C) >= 0;
  10691. end;
  10692. function AsciiIsOctalCharW(const C: WideChar): Boolean;
  10693. begin
  10694. Result := AsciiOctalCharValueW(C) >= 0;
  10695. end;
  10696. { }
  10697. { Compare }
  10698. { }
  10699. function CharCompareA(const A, B: AnsiChar): Integer;
  10700. begin
  10701. if Ord(A) < Ord(B) then
  10702. Result := -1 else
  10703. if Ord(A) > Ord(B) then
  10704. Result := 1
  10705. else
  10706. Result := 0;
  10707. end;
  10708. function CharCompareW(const A, B: WideChar): Integer;
  10709. begin
  10710. if Ord(A) < Ord(B) then
  10711. Result := -1 else
  10712. if Ord(A) > Ord(B) then
  10713. Result := 1
  10714. else
  10715. Result := 0;
  10716. end;
  10717. function CharCompare(const A, B: Char): Integer;
  10718. begin
  10719. {$IFDEF CharIsWide}
  10720. Result := CharCompareW(A, B);
  10721. {$ELSE}
  10722. Result := CharCompareA(A, B);
  10723. {$ENDIF}
  10724. end;
  10725. function CharCompareNoAsciiCaseA(const A, B: AnsiChar): Integer;
  10726. var C, D : AnsiChar;
  10727. begin
  10728. C := AsciiUpCaseA(A);
  10729. D := AsciiUpCaseA(B);
  10730. if Ord(C) < Ord(D) then
  10731. Result := -1 else
  10732. if Ord(C) > Ord(D) then
  10733. Result := 1
  10734. else
  10735. Result := 0;
  10736. end;
  10737. function CharCompareNoAsciiCaseW(const A, B: WideChar): Integer;
  10738. var C, D : WideChar;
  10739. begin
  10740. C := AsciiUpCaseW(A);
  10741. D := AsciiUpCaseW(B);
  10742. if Ord(C) < Ord(D) then
  10743. Result := -1 else
  10744. if Ord(C) > Ord(D) then
  10745. Result := 1
  10746. else
  10747. Result := 0;
  10748. end;
  10749. function CharCompareNoAsciiCase(const A, B: Char): Integer;
  10750. var C, D : Char;
  10751. begin
  10752. C := AsciiUpCase(A);
  10753. D := AsciiUpCase(B);
  10754. if Ord(C) < Ord(D) then
  10755. Result := -1 else
  10756. if Ord(C) > Ord(D) then
  10757. Result := 1
  10758. else
  10759. Result := 0;
  10760. end;
  10761. function CharCompareNoUnicodeCaseW(const A, B: WideChar): Integer;
  10762. var C, D : WideChar;
  10763. begin
  10764. C := UnicodeUpCase(A);
  10765. D := UnicodeUpCase(B);
  10766. if Ord(C) < Ord(D) then
  10767. Result := -1 else
  10768. if Ord(C) > Ord(D) then
  10769. Result := 1
  10770. else
  10771. Result := 0;
  10772. end;
  10773. function CharEqualNoAsciiCaseA(const A, B: AnsiChar): Boolean;
  10774. begin
  10775. Result := AsciiUpCaseA(A) = AsciiUpCaseA(B);
  10776. end;
  10777. function CharEqualNoAsciiCaseW(const A, B: WideChar): Boolean;
  10778. begin
  10779. Result := AsciiUpCaseW(A) = AsciiUpCaseW(B);
  10780. end;
  10781. function CharEqualNoAsciiCase(const A, B: Char): Boolean;
  10782. begin
  10783. Result := AsciiUpCase(A) = AsciiUpCase(B);
  10784. end;
  10785. {$IFDEF CLR}
  10786. function StrPCompareA(const A, B: AnsiString; const Len: Integer): Integer;
  10787. var C, D : Integer;
  10788. I : Integer;
  10789. begin
  10790. for I := 1 to Len do
  10791. begin
  10792. C := Ord(A[I]);
  10793. D := Ord(B[I]);
  10794. if C <> D then
  10795. begin
  10796. if C < D then
  10797. Result := -1
  10798. else
  10799. Result := 1;
  10800. exit;
  10801. end;
  10802. end;
  10803. Result := 0;
  10804. end;
  10805. function StrPCompareNoAsciiCaseA(const A, B: AnsiString; const Len: Integer): Integer;
  10806. var C, D : Integer;
  10807. I : Integer;
  10808. begin
  10809. for I := 1 to Len do
  10810. begin
  10811. C := Ord(AsciiLowCaseLookup[A[I]]);
  10812. D := Ord(AsciiLowCaseLookup[B[I]]);
  10813. if C <> D then
  10814. begin
  10815. if C < D then
  10816. Result := -1
  10817. else
  10818. Result := 1;
  10819. exit;
  10820. end;
  10821. end;
  10822. Result := 0;
  10823. end;
  10824. {$ELSE}
  10825. function StrPCompareA(const A, B: PAnsiChar; const Len: Integer): Integer;
  10826. var P, Q : PAnsiChar;
  10827. I : Integer;
  10828. begin
  10829. P := A;
  10830. Q := B;
  10831. if P <> Q then
  10832. for I := 1 to Len do
  10833. if P^ = Q^ then
  10834. begin
  10835. Inc(P);
  10836. Inc(Q);
  10837. end
  10838. else
  10839. begin
  10840. if Ord(P^) < Ord(Q^) then
  10841. Result := -1
  10842. else
  10843. Result := 1;
  10844. exit;
  10845. end;
  10846. Result := 0;
  10847. end;
  10848. function StrPCompareW(const A, B: PWideChar; const Len: Integer): Integer;
  10849. var P, Q : PWideChar;
  10850. I : Integer;
  10851. begin
  10852. P := A;
  10853. Q := B;
  10854. if P <> Q then
  10855. for I := 1 to Len do
  10856. if Ord(P^) = Ord(Q^) then
  10857. begin
  10858. Inc(P);
  10859. Inc(Q);
  10860. end
  10861. else
  10862. begin
  10863. if Ord(P^) < Ord(Q^) then
  10864. Result := -1
  10865. else
  10866. Result := 1;
  10867. exit;
  10868. end;
  10869. Result := 0;
  10870. end;
  10871. function StrPCompare(const A, B: PChar; const Len: Integer): Integer;
  10872. var P, Q : PChar;
  10873. I : Integer;
  10874. begin
  10875. P := A;
  10876. Q := B;
  10877. if P <> Q then
  10878. for I := 1 to Len do
  10879. if Ord(P^) = Ord(Q^) then
  10880. begin
  10881. Inc(P);
  10882. Inc(Q);
  10883. end
  10884. else
  10885. begin
  10886. if Ord(P^) < Ord(Q^) then
  10887. Result := -1
  10888. else
  10889. Result := 1;
  10890. exit;
  10891. end;
  10892. Result := 0;
  10893. end;
  10894. function StrPCompareNoAsciiCaseA(const A, B: PAnsiChar; const Len: Integer): Integer;
  10895. var P, Q : PAnsiChar;
  10896. C, D : Integer;
  10897. I : Integer;
  10898. begin
  10899. P := A;
  10900. Q := B;
  10901. if P <> Q then
  10902. for I := 1 to Len do
  10903. begin
  10904. C := Integer(AsciiLowCaseLookup[P^]);
  10905. D := Integer(AsciiLowCaseLookup[Q^]);
  10906. if C = D then
  10907. begin
  10908. Inc(P);
  10909. Inc(Q);
  10910. end
  10911. else
  10912. begin
  10913. if Ord(C) < Ord(D) then
  10914. Result := -1
  10915. else
  10916. Result := 1;
  10917. exit;
  10918. end;
  10919. end;
  10920. Result := 0;
  10921. end;
  10922. function StrPCompareNoAsciiCaseW(const A, B: PWideChar; const Len: Integer): Integer;
  10923. var P, Q : PWideChar;
  10924. C, D : Integer;
  10925. I : Integer;
  10926. begin
  10927. P := A;
  10928. Q := B;
  10929. if P <> Q then
  10930. for I := 1 to Len do
  10931. begin
  10932. C := Ord(P^);
  10933. D := Ord(Q^);
  10934. if C <= $7F then
  10935. C := Integer(AsciiLowCaseLookup[AnsiChar(Byte(C))]);
  10936. if D <= $7F then
  10937. D := Integer(AsciiLowCaseLookup[AnsiChar(Byte(D))]);
  10938. if C = D then
  10939. begin
  10940. Inc(P);
  10941. Inc(Q);
  10942. end
  10943. else
  10944. begin
  10945. if C < D then
  10946. Result := -1
  10947. else
  10948. Result := 1;
  10949. exit;
  10950. end;
  10951. end;
  10952. Result := 0;
  10953. end;
  10954. function StrPCompareNoAsciiCase(const A, B: PChar; const Len: Integer): Integer;
  10955. var P, Q : PChar;
  10956. C, D : Integer;
  10957. I : Integer;
  10958. begin
  10959. P := A;
  10960. Q := B;
  10961. if P <> Q then
  10962. for I := 1 to Len do
  10963. begin
  10964. C := Ord(P^);
  10965. D := Ord(Q^);
  10966. if C <= $7F then
  10967. C := Integer(AsciiLowCaseLookup[AnsiChar(Byte(C))]);
  10968. if D <= $7F then
  10969. D := Integer(AsciiLowCaseLookup[AnsiChar(Byte(D))]);
  10970. if C = D then
  10971. begin
  10972. Inc(P);
  10973. Inc(Q);
  10974. end
  10975. else
  10976. begin
  10977. if C < D then
  10978. Result := -1
  10979. else
  10980. Result := 1;
  10981. exit;
  10982. end;
  10983. end;
  10984. Result := 0;
  10985. end;
  10986. function StrPCompareNoUnicodeCaseW(const A, B: PWideChar; const Len: Integer): Integer;
  10987. var P, Q : PWideChar;
  10988. C, D : WideChar;
  10989. I : Integer;
  10990. begin
  10991. P := A;
  10992. Q := B;
  10993. if P <> Q then
  10994. for I := 1 to Len do
  10995. begin
  10996. C := UnicodeUpCase(P^);
  10997. D := UnicodeUpCase(Q^);
  10998. if C = D then
  10999. begin
  11000. Inc(P);
  11001. Inc(Q);
  11002. end
  11003. else
  11004. begin
  11005. if C < D then
  11006. Result := -1
  11007. else
  11008. Result := 1;
  11009. exit;
  11010. end;
  11011. end;
  11012. Result := 0;
  11013. end;
  11014. {$ENDIF}
  11015. {$IFDEF CLR}
  11016. function StrCompare(const A, B: AnsiString): Integer;
  11017. var L, M, I: Integer;
  11018. begin
  11019. L := Length(A);
  11020. M := Length(B);
  11021. if L < M then
  11022. I := L
  11023. else
  11024. I := M;
  11025. Result := StrPCompareA(A, B, I);
  11026. if Result <> 0 then
  11027. exit;
  11028. if L = M then
  11029. Result := 0 else
  11030. if L < M then
  11031. Result := -1
  11032. else
  11033. Result := 1;
  11034. end;
  11035. function StrCompareNoCase(const A, B: AnsiString): Integer;
  11036. var L, M, I: Integer;
  11037. begin
  11038. L := Length(A);
  11039. M := Length(B);
  11040. if L < M then
  11041. I := L
  11042. else
  11043. I := M;
  11044. Result := StrPCompareNoAsciiCaseA(A, B, I);
  11045. if Result <> 0 then
  11046. exit;
  11047. if L = M then
  11048. Result := 0 else
  11049. if L < M then
  11050. Result := -1
  11051. else
  11052. Result := 1;
  11053. end;
  11054. {$ELSE}
  11055. function StrCompareA(const A, B: AnsiString): Integer;
  11056. var L, M, I: Integer;
  11057. begin
  11058. L := Length(A);
  11059. M := Length(B);
  11060. if L < M then
  11061. I := L
  11062. else
  11063. I := M;
  11064. Result := StrPCompareA(Pointer(A), Pointer(B), I);
  11065. if Result <> 0 then
  11066. exit;
  11067. if L = M then
  11068. Result := 0 else
  11069. if L < M then
  11070. Result := -1
  11071. else
  11072. Result := 1;
  11073. end;
  11074. function StrCompareW(const A, B: WideString): Integer;
  11075. var L, M, I: Integer;
  11076. begin
  11077. L := Length(A);
  11078. M := Length(B);
  11079. if L < M then
  11080. I := L
  11081. else
  11082. I := M;
  11083. Result := StrPCompareW(Pointer(A), Pointer(B), I);
  11084. if Result <> 0 then
  11085. exit;
  11086. if L = M then
  11087. Result := 0 else
  11088. if L < M then
  11089. Result := -1
  11090. else
  11091. Result := 1;
  11092. end;
  11093. function StrCompareU(const A, B: UnicodeString): Integer;
  11094. var L, M, I: Integer;
  11095. begin
  11096. L := Length(A);
  11097. M := Length(B);
  11098. if L < M then
  11099. I := L
  11100. else
  11101. I := M;
  11102. Result := StrPCompareW(Pointer(A), Pointer(B), I);
  11103. if Result <> 0 then
  11104. exit;
  11105. if L = M then
  11106. Result := 0 else
  11107. if L < M then
  11108. Result := -1
  11109. else
  11110. Result := 1;
  11111. end;
  11112. function StrCompare(const A, B: String): Integer;
  11113. var L, M, I: Integer;
  11114. begin
  11115. L := Length(A);
  11116. M := Length(B);
  11117. if L < M then
  11118. I := L
  11119. else
  11120. I := M;
  11121. Result := StrPCompare(Pointer(A), Pointer(B), I);
  11122. if Result <> 0 then
  11123. exit;
  11124. if L = M then
  11125. Result := 0 else
  11126. if L < M then
  11127. Result := -1
  11128. else
  11129. Result := 1;
  11130. end;
  11131. function StrCompareNoAsciiCaseA(const A, B: AnsiString): Integer;
  11132. var L, M, I: Integer;
  11133. begin
  11134. L := Length(A);
  11135. M := Length(B);
  11136. if L < M then
  11137. I := L
  11138. else
  11139. I := M;
  11140. Result := StrPCompareNoAsciiCaseA(Pointer(A), Pointer(B), I);
  11141. if Result <> 0 then
  11142. exit;
  11143. if L = M then
  11144. Result := 0 else
  11145. if L < M then
  11146. Result := -1
  11147. else
  11148. Result := 1;
  11149. end;
  11150. function StrCompareNoAsciiCaseW(const A, B: WideString): Integer;
  11151. var L, M, I: Integer;
  11152. begin
  11153. L := Length(A);
  11154. M := Length(B);
  11155. if L < M then
  11156. I := L
  11157. else
  11158. I := M;
  11159. Result := StrPCompareNoAsciiCaseW(Pointer(A), Pointer(B), I);
  11160. if Result <> 0 then
  11161. exit;
  11162. if L = M then
  11163. Result := 0 else
  11164. if L < M then
  11165. Result := -1
  11166. else
  11167. Result := 1;
  11168. end;
  11169. function StrCompareNoAsciiCaseU(const A, B: UnicodeString): Integer;
  11170. var L, M, I: Integer;
  11171. begin
  11172. L := Length(A);
  11173. M := Length(B);
  11174. if L < M then
  11175. I := L
  11176. else
  11177. I := M;
  11178. Result := StrPCompareNoAsciiCaseW(Pointer(A), Pointer(B), I);
  11179. if Result <> 0 then
  11180. exit;
  11181. if L = M then
  11182. Result := 0 else
  11183. if L < M then
  11184. Result := -1
  11185. else
  11186. Result := 1;
  11187. end;
  11188. function StrCompareNoAsciiCase(const A, B: String): Integer;
  11189. var L, M, I: Integer;
  11190. begin
  11191. L := Length(A);
  11192. M := Length(B);
  11193. if L < M then
  11194. I := L
  11195. else
  11196. I := M;
  11197. Result := StrPCompareNoAsciiCase(Pointer(A), Pointer(B), I);
  11198. if Result <> 0 then
  11199. exit;
  11200. if L = M then
  11201. Result := 0 else
  11202. if L < M then
  11203. Result := -1
  11204. else
  11205. Result := 1;
  11206. end;
  11207. function StrCompareNoUnicodeCaseW(const A, B: WideString): Integer;
  11208. var L, M, I: Integer;
  11209. begin
  11210. L := Length(A);
  11211. M := Length(B);
  11212. if L < M then
  11213. I := L
  11214. else
  11215. I := M;
  11216. Result := StrPCompareNoUnicodeCaseW(Pointer(A), Pointer(B), I);
  11217. if Result <> 0 then
  11218. exit;
  11219. if L = M then
  11220. Result := 0 else
  11221. if L < M then
  11222. Result := -1
  11223. else
  11224. Result := 1;
  11225. end;
  11226. function StrCompareNoUnicodeCaseU(const A, B: UnicodeString): Integer;
  11227. var L, M, I: Integer;
  11228. begin
  11229. L := Length(A);
  11230. M := Length(B);
  11231. if L < M then
  11232. I := L
  11233. else
  11234. I := M;
  11235. Result := StrPCompareNoUnicodeCaseW(Pointer(A), Pointer(B), I);
  11236. if Result <> 0 then
  11237. exit;
  11238. if L = M then
  11239. Result := 0 else
  11240. if L < M then
  11241. Result := -1
  11242. else
  11243. Result := 1;
  11244. end;
  11245. {$ENDIF}
  11246. { }
  11247. { Match }
  11248. { }
  11249. function WideCharInCharSet(const A: WideChar; const C: CharSet): Boolean;
  11250. begin
  11251. if Ord(A) >= $100 then
  11252. Result := False
  11253. else
  11254. Result := AnsiChar(Ord(A)) in C;
  11255. end;
  11256. function CharInCharSet(const A: Char; const C: CharSet): Boolean;
  11257. begin
  11258. {$IFDEF CharIsWide}
  11259. if Ord(A) >= $100 then
  11260. Result := False
  11261. else
  11262. Result := AnsiChar(Ord(A)) in C;
  11263. {$ELSE}
  11264. Result := A in C;
  11265. {$ENDIF}
  11266. end;
  11267. {$IFDEF ASM386_DELPHI}
  11268. function CharMatchNoAsciiCaseA(const A, B: AnsiChar): Boolean;
  11269. asm
  11270. AND EAX, $000000FF
  11271. AND EDX, $000000FF
  11272. MOV AL, BYTE PTR [AsciiLowCaseLookup + EAX]
  11273. CMP AL, BYTE PTR [AsciiLowCaseLookup + EDX]
  11274. SETZ AL
  11275. end;
  11276. {$ELSE}
  11277. function CharMatchNoAsciiCaseA(const A, B: AnsiChar): Boolean;
  11278. begin
  11279. Result := AsciiLowCaseLookup[A] = AsciiLowCaseLookup[B];
  11280. end;
  11281. {$ENDIF}
  11282. function CharMatchNoAsciiCaseW(const A, B: WideChar): Boolean;
  11283. begin
  11284. if (Ord(A) <= $7F) and (Ord(B) <= $7F) then
  11285. Result := AsciiLowCaseLookup[AnsiChar(Ord(A))] = AsciiLowCaseLookup[AnsiChar(Ord(B))]
  11286. else
  11287. Result := Ord(A) = Ord(B);
  11288. end;
  11289. function CharMatchNoAsciiCaseAW(const A: AnsiChar; const B: WideChar): Boolean;
  11290. begin
  11291. if (Ord(A) <= $7F) and (Ord(B) <= $7F) then
  11292. Result := AsciiLowCaseLookup[AnsiChar(Ord(A))] = AsciiLowCaseLookup[AnsiChar(Ord(B))]
  11293. else
  11294. Result := Ord(A) = Ord(B);
  11295. end;
  11296. function CharMatchNoAsciiCase(const A, B: Char): Boolean;
  11297. begin
  11298. if (Ord(A) <= $7F) and (Ord(B) <= $7F) then
  11299. Result := AsciiLowCaseLookup[AnsiChar(Ord(A))] = AsciiLowCaseLookup[AnsiChar(Ord(B))]
  11300. else
  11301. Result := Ord(A) = Ord(B);
  11302. end;
  11303. {$IFDEF ASM386_DELPHI}
  11304. function CharMatchA(const A, B: AnsiChar; const AsciiCaseSensitive: Boolean): Boolean;
  11305. asm
  11306. OR CL, CL
  11307. JZ CharMatchNoAsciiCaseA
  11308. CMP AL, DL
  11309. SETZ AL
  11310. end;
  11311. {$ELSE}
  11312. function CharMatchA(const A, B: AnsiChar; const AsciiCaseSensitive: Boolean): Boolean;
  11313. begin
  11314. if AsciiCaseSensitive then
  11315. Result := A = B
  11316. else
  11317. Result := AsciiLowCaseLookup[A] = AsciiLowCaseLookup[B];
  11318. end;
  11319. {$ENDIF}
  11320. function CharMatchW(const A, B: WideChar; const AsciiCaseSensitive: Boolean = True): Boolean;
  11321. begin
  11322. if AsciiCaseSensitive then
  11323. Result := A = B
  11324. else
  11325. if (Ord(A) <= $7F) and (Ord(B) <= $7F) then
  11326. Result := AsciiLowCaseLookup[AnsiChar(Ord(A))] = AsciiLowCaseLookup[AnsiChar(Ord(B))]
  11327. else
  11328. Result := A = B;
  11329. end;
  11330. function CharMatchAW(const A: AnsiChar; const B: WideChar; const AsciiCaseSensitive: Boolean = True): Boolean;
  11331. begin
  11332. if AsciiCaseSensitive then
  11333. Result := Ord(A) = Ord(B)
  11334. else
  11335. if (Ord(A) <= $7F) and (Ord(B) <= $7F) then
  11336. Result := AsciiLowCaseLookup[AnsiChar(Ord(A))] = AsciiLowCaseLookup[AnsiChar(Ord(B))]
  11337. else
  11338. Result := Ord(A) = Ord(B);
  11339. end;
  11340. function CharMatch(const A, B: Char; const AsciiCaseSensitive: Boolean = True): Boolean;
  11341. begin
  11342. if AsciiCaseSensitive then
  11343. Result := A = B
  11344. else
  11345. if (Ord(A) <= $7F) and (Ord(B) <= $7F) then
  11346. Result := AsciiLowCaseLookup[AnsiChar(Ord(A))] = AsciiLowCaseLookup[AnsiChar(Ord(B))]
  11347. else
  11348. Result := A = B;
  11349. end;
  11350. function CharSetMatchCharA(const A: CharSet; const B: AnsiChar; const AsciiCaseSensitive: Boolean): Boolean;
  11351. begin
  11352. if AsciiCaseSensitive then
  11353. Result := B in A
  11354. else
  11355. Result := (AsciiUpCaseA(B) in A) or (AsciiLowCaseA(B) in A);
  11356. end;
  11357. function CharSetMatchCharW(const A: CharSet; const B: WideChar; const AsciiCaseSensitive: Boolean): Boolean;
  11358. begin
  11359. if Ord(B) > $FF then
  11360. Result := False
  11361. else
  11362. if AsciiCaseSensitive then
  11363. Result := AnsiChar(Ord(B)) in A
  11364. else
  11365. Result := (AsciiUpCaseA(AnsiChar(Ord(B))) in A) or
  11366. (AsciiLowCaseA(AnsiChar(Ord(B))) in A);
  11367. end;
  11368. function CharSetMatchChar(const A: CharSet; const B: Char; const AsciiCaseSensitive: Boolean): Boolean;
  11369. begin
  11370. {$IFDEF StringIsUnicode}
  11371. if Ord(B) > $FF then
  11372. Result := False
  11373. else
  11374. {$ENDIF}
  11375. if AsciiCaseSensitive then
  11376. Result := AnsiChar(Ord(B)) in A
  11377. else
  11378. Result := (AsciiUpCaseA(AnsiChar(Ord(B))) in A) or
  11379. (AsciiLowCaseA(AnsiChar(Ord(B))) in A);
  11380. end;
  11381. {$IFDEF ManagedCode}
  11382. function StrPMatchA(const A, B: AnsiString; const Len: Integer): Boolean;
  11383. var I : Integer;
  11384. begin
  11385. for I := 1 to Len do
  11386. if A[I] <> B[I] then
  11387. begin
  11388. Result := False;
  11389. exit;
  11390. end;
  11391. Result := True;
  11392. end;
  11393. {$ELSE}
  11394. function StrPMatchA(const A, B: PAnsiChar; const Len: Integer): Boolean;
  11395. var P, Q : PAnsiChar;
  11396. I : Integer;
  11397. begin
  11398. P := A;
  11399. Q := B;
  11400. if P <> Q then
  11401. for I := 1 to Len do
  11402. if P^ = Q^ then
  11403. begin
  11404. Inc(P);
  11405. Inc(Q);
  11406. end else
  11407. begin
  11408. Result := False;
  11409. exit;
  11410. end;
  11411. Result := True;
  11412. end;
  11413. function StrPMatchW(const A, B: PWideChar; const Len: Integer): Boolean;
  11414. var P, Q : PWideChar;
  11415. I : Integer;
  11416. begin
  11417. P := A;
  11418. Q := B;
  11419. if P <> Q then
  11420. for I := 1 to Len do
  11421. if P^ = Q^ then
  11422. begin
  11423. Inc(P);
  11424. Inc(Q);
  11425. end else
  11426. begin
  11427. Result := False;
  11428. exit;
  11429. end;
  11430. Result := True;
  11431. end;
  11432. function StrPMatchAW(const A: PWideChar; B: PAnsiChar; const Len: Integer): Boolean;
  11433. var P : PWideChar;
  11434. Q : PAnsiChar;
  11435. I : Integer;
  11436. begin
  11437. P := A;
  11438. Q := B;
  11439. for I := 1 to Len do
  11440. if Ord(P^) = Ord(Q^) then
  11441. begin
  11442. Inc(P);
  11443. Inc(Q);
  11444. end else
  11445. begin
  11446. Result := False;
  11447. exit;
  11448. end;
  11449. Result := True;
  11450. end;
  11451. function StrPMatch(const A, B: PChar; const Len: Integer): Boolean;
  11452. var P, Q : PChar;
  11453. I : Integer;
  11454. begin
  11455. P := A;
  11456. Q := B;
  11457. if P <> Q then
  11458. for I := 1 to Len do
  11459. if P^ = Q^ then
  11460. begin
  11461. Inc(P);
  11462. Inc(Q);
  11463. end else
  11464. begin
  11465. Result := False;
  11466. exit;
  11467. end;
  11468. Result := True;
  11469. end;
  11470. {$ENDIF}
  11471. {$IFNDEF ManagedCode}
  11472. function StrPMatchA(const S, M: PAnsiChar; const LenS, LenM: Integer): Boolean;
  11473. var P, Q : PAnsiChar;
  11474. I : Integer;
  11475. begin
  11476. if LenM = 0 then
  11477. begin
  11478. Result := True;
  11479. exit;
  11480. end;
  11481. if LenM > LenS then
  11482. begin
  11483. Result := False;
  11484. exit;
  11485. end;
  11486. if Pointer(S) = Pointer(M) then
  11487. begin
  11488. Result := True;
  11489. exit;
  11490. end;
  11491. P := S;
  11492. Q := M;
  11493. for I := 1 to LenM do
  11494. if P^ = Q^ then
  11495. begin
  11496. Inc(P);
  11497. Inc(Q);
  11498. end else
  11499. begin
  11500. Result := False;
  11501. exit;
  11502. end;
  11503. Result := True;
  11504. end;
  11505. function StrPMatchW(const S, M: PWideChar; const LenS, LenM: Integer): Boolean;
  11506. var P, Q : PWideChar;
  11507. I : Integer;
  11508. begin
  11509. if LenM = 0 then
  11510. begin
  11511. Result := True;
  11512. exit;
  11513. end;
  11514. if LenM > LenS then
  11515. begin
  11516. Result := False;
  11517. exit;
  11518. end;
  11519. if Pointer(S) = Pointer(M) then
  11520. begin
  11521. Result := True;
  11522. exit;
  11523. end;
  11524. P := S;
  11525. Q := M;
  11526. for I := 1 to LenM do
  11527. if P^ = Q^ then
  11528. begin
  11529. Inc(P);
  11530. Inc(Q);
  11531. end else
  11532. begin
  11533. Result := False;
  11534. exit;
  11535. end;
  11536. Result := True;
  11537. end;
  11538. function StrPMatchAW(const S: PWideChar; const M: PAnsiChar; const LenS, LenM: Integer): Boolean;
  11539. var P : PWideChar;
  11540. Q : PAnsiChar;
  11541. I : Integer;
  11542. begin
  11543. if LenM = 0 then
  11544. begin
  11545. Result := True;
  11546. exit;
  11547. end;
  11548. if LenM > LenS then
  11549. begin
  11550. Result := False;
  11551. exit;
  11552. end;
  11553. P := S;
  11554. Q := M;
  11555. for I := 1 to LenM do
  11556. if Ord(P^) = Ord(Q^) then
  11557. begin
  11558. Inc(P);
  11559. Inc(Q);
  11560. end else
  11561. begin
  11562. Result := False;
  11563. exit;
  11564. end;
  11565. Result := True;
  11566. end;
  11567. function StrPMatch(const S, M: PChar; const LenS, LenM: Integer): Boolean;
  11568. var P, Q : PChar;
  11569. I : Integer;
  11570. begin
  11571. if LenM = 0 then
  11572. begin
  11573. Result := True;
  11574. exit;
  11575. end;
  11576. if LenM > LenS then
  11577. begin
  11578. Result := False;
  11579. exit;
  11580. end;
  11581. if Pointer(S) = Pointer(M) then
  11582. begin
  11583. Result := True;
  11584. exit;
  11585. end;
  11586. P := S;
  11587. Q := M;
  11588. for I := 1 to LenM do
  11589. if P^ = Q^ then
  11590. begin
  11591. Inc(P);
  11592. Inc(Q);
  11593. end else
  11594. begin
  11595. Result := False;
  11596. exit;
  11597. end;
  11598. Result := True;
  11599. end;
  11600. function StrPMatchStrPA(const S: PChar; const M: PAnsiChar; const LenS, LenM: Integer): Boolean;
  11601. var P : PChar;
  11602. Q : PAnsiChar;
  11603. I : Integer;
  11604. begin
  11605. if LenM = 0 then
  11606. begin
  11607. Result := True;
  11608. exit;
  11609. end;
  11610. if LenM > LenS then
  11611. begin
  11612. Result := False;
  11613. exit;
  11614. end;
  11615. P := S;
  11616. Q := M;
  11617. for I := 1 to LenM do
  11618. if Ord(P^) = Ord(Q^) then
  11619. begin
  11620. Inc(P);
  11621. Inc(Q);
  11622. end else
  11623. begin
  11624. Result := False;
  11625. exit;
  11626. end;
  11627. Result := True;
  11628. end;
  11629. function StrPMatchStrA(const S: PAnsiChar; const Len: Integer; const M: AnsiString): Boolean;
  11630. begin
  11631. Result := StrPMatchA(S, Pointer(M), Len, Length(M));
  11632. end;
  11633. function StrPMatchStrW(const S: PWideChar; const Len: Integer; const M: WideString): Boolean;
  11634. begin
  11635. Result := StrPMatchW(S, Pointer(M), Len, Length(M));
  11636. end;
  11637. function StrPMatchStrAW(const S: PWideChar; const Len: Integer; const M: AnsiString): Boolean;
  11638. begin
  11639. Result := StrPMatchAW(S, Pointer(M), Len, Length(M));
  11640. end;
  11641. function StrPMatchStrU(const S: PWideChar; const Len: Integer; const M: UnicodeString): Boolean;
  11642. begin
  11643. Result := StrPMatchW(S, Pointer(M), Len, Length(M));
  11644. end;
  11645. function StrPMatchStr(const S: PChar; const Len: Integer; const M: String): Boolean;
  11646. begin
  11647. Result := StrPMatch(S, Pointer(M), Len, Length(M));
  11648. end;
  11649. {$ENDIF}
  11650. {$IFDEF CLR}
  11651. function StrPMatchNoAsciiCaseA(const A, B: AnsiString; const Len: Integer): Boolean;
  11652. var C, D : Integer;
  11653. I : Integer;
  11654. begin
  11655. for I := 1 to Len do
  11656. begin
  11657. C := Integer(AsciiLowCaseLookup[A[I]]);
  11658. D := Integer(AsciiLowCaseLookup[B[I]]);
  11659. if C <> D then
  11660. begin
  11661. Result := False;
  11662. exit;
  11663. end;
  11664. end;
  11665. Result := True;
  11666. end;
  11667. {$ELSE}
  11668. function StrPMatchNoAsciiCaseA(const A, B: PAnsiChar; const Len: Integer): Boolean;
  11669. var P, Q : PAnsiChar;
  11670. C, D : Integer;
  11671. I : Integer;
  11672. begin
  11673. P := A;
  11674. Q := B;
  11675. if P <> Q then
  11676. for I := 1 to Len do
  11677. begin
  11678. C := Integer(AsciiLowCaseLookup[P^]);
  11679. D := Integer(AsciiLowCaseLookup[Q^]);
  11680. if C = D then
  11681. begin
  11682. Inc(P);
  11683. Inc(Q);
  11684. end else
  11685. begin
  11686. Result := False;
  11687. exit;
  11688. end;
  11689. end;
  11690. Result := True;
  11691. end;
  11692. function StrPMatchNoAsciiCaseW(const A, B: PWideChar; const Len: Integer): Boolean;
  11693. var P, Q : PWideChar;
  11694. I : Integer;
  11695. begin
  11696. P := A;
  11697. Q := B;
  11698. if P <> Q then
  11699. for I := 1 to Len do
  11700. begin
  11701. if CharMatchNoAsciiCaseW(P^, Q^) then
  11702. begin
  11703. Inc(P);
  11704. Inc(Q);
  11705. end else
  11706. begin
  11707. Result := False;
  11708. exit;
  11709. end;
  11710. end;
  11711. Result := True;
  11712. end;
  11713. function StrPMatchNoAsciiCaseAW(const A: PWideChar; const B: PAnsiChar; const Len: Integer): Boolean;
  11714. var P : PWideChar;
  11715. Q : PAnsiChar;
  11716. I : Integer;
  11717. begin
  11718. P := A;
  11719. Q := B;
  11720. for I := 1 to Len do
  11721. begin
  11722. if CharMatchNoAsciiCaseAW(Q^, P^) then
  11723. begin
  11724. Inc(P);
  11725. Inc(Q);
  11726. end else
  11727. begin
  11728. Result := False;
  11729. exit;
  11730. end;
  11731. end;
  11732. Result := True;
  11733. end;
  11734. function StrPMatchNoAsciiCase(const A, B: PChar; const Len: Integer): Boolean;
  11735. var P, Q : PChar;
  11736. I : Integer;
  11737. begin
  11738. P := A;
  11739. Q := B;
  11740. if P <> Q then
  11741. for I := 1 to Len do
  11742. begin
  11743. if CharMatchNoAsciiCase(P^, Q^) then
  11744. begin
  11745. Inc(P);
  11746. Inc(Q);
  11747. end else
  11748. begin
  11749. Result := False;
  11750. exit;
  11751. end;
  11752. end;
  11753. Result := True;
  11754. end;
  11755. function StrPMatchNoUnicodeCaseW(const A, B: PWideChar; const Len: Integer): Boolean;
  11756. var P, Q : PWideChar;
  11757. I : Integer;
  11758. begin
  11759. P := A;
  11760. Q := B;
  11761. if P <> Q then
  11762. for I := 1 to Len do
  11763. begin
  11764. if UnicodeCharIsEqualNoCase(P^, Q^) then
  11765. begin
  11766. Inc(P);
  11767. Inc(Q);
  11768. end else
  11769. begin
  11770. Result := False;
  11771. exit;
  11772. end;
  11773. end;
  11774. Result := True;
  11775. end;
  11776. {$ENDIF}
  11777. {$IFNDEF CLR}
  11778. function StrPMatchLenA(const P: PAnsiChar; const Len: Integer; const M: CharSet): Integer;
  11779. var Q : PAnsiChar;
  11780. L : Integer;
  11781. begin
  11782. Q := P;
  11783. L := Len;
  11784. Result := 0;
  11785. if not Assigned(Q) then
  11786. exit;
  11787. while L > 0 do
  11788. if Q^ in M then
  11789. begin
  11790. Inc(Q);
  11791. Dec(L);
  11792. Inc(Result);
  11793. end
  11794. else
  11795. exit;
  11796. end;
  11797. function StrPMatchLenW(const P: PWideChar; const Len: Integer; const M: CharSet): Integer;
  11798. var Q : PWideChar;
  11799. L : Integer;
  11800. begin
  11801. Q := P;
  11802. L := Len;
  11803. Result := 0;
  11804. if not Assigned(Q) then
  11805. exit;
  11806. while L > 0 do
  11807. if WideCharInCharSet(Q^, M) then
  11808. begin
  11809. Inc(Q);
  11810. Dec(L);
  11811. Inc(Result);
  11812. end
  11813. else
  11814. exit;
  11815. end;
  11816. function StrPMatchLenW(const P: PWideChar; const Len: Integer; const M: TWideCharMatchFunction): Integer;
  11817. var Q : PWideChar;
  11818. L : Integer;
  11819. begin
  11820. Q := P;
  11821. L := Len;
  11822. Result := 0;
  11823. if not Assigned(Q) then
  11824. exit;
  11825. while L > 0 do
  11826. if M(Q^) then
  11827. begin
  11828. Inc(Q);
  11829. Dec(L);
  11830. Inc(Result);
  11831. end
  11832. else
  11833. exit;
  11834. end;
  11835. function StrPMatchLen(const P: PChar; const Len: Integer; const M: CharSet): Integer;
  11836. var Q : PChar;
  11837. C : Char;
  11838. L : Integer;
  11839. begin
  11840. Q := P;
  11841. L := Len;
  11842. Result := 0;
  11843. if not Assigned(Q) then
  11844. exit;
  11845. while L > 0 do
  11846. begin
  11847. C := Q^;
  11848. {$IFDEF StringIsUnicode}
  11849. if WideCharInCharSet(C, M) then
  11850. {$ELSE}
  11851. if C in M then
  11852. {$ENDIF}
  11853. begin
  11854. Inc(Q);
  11855. Dec(L);
  11856. Inc(Result);
  11857. end
  11858. else
  11859. exit;
  11860. end;
  11861. end;
  11862. function StrPMatchCountA(const P: PAnsiChar; const Len: Integer; const M: CharSet): Integer;
  11863. var Q : PAnsiChar;
  11864. L : Integer;
  11865. begin
  11866. Q := P;
  11867. L := Len;
  11868. Result := 0;
  11869. if not Assigned(Q) then
  11870. exit;
  11871. while L > 0 do
  11872. begin
  11873. if Q^ in M then
  11874. Inc(Result);
  11875. Inc(Q);
  11876. Dec(L);
  11877. end;
  11878. end;
  11879. function StrPMatchCountW(const P: PWideChar; const Len: Integer; const M: CharSet): Integer;
  11880. var Q : PWideChar;
  11881. L : Integer;
  11882. begin
  11883. Q := P;
  11884. L := Len;
  11885. Result := 0;
  11886. if not Assigned(Q) then
  11887. exit;
  11888. while L > 0 do
  11889. begin
  11890. if WideCharInCharSet(Q^, M) then
  11891. Inc(Result);
  11892. Inc(Q);
  11893. Dec(L);
  11894. end;
  11895. end;
  11896. function StrPMatchCountW(const P: PWideChar; const Len: Integer; const M: TWideCharMatchFunction): Integer;
  11897. var Q : PWideChar;
  11898. L : Integer;
  11899. begin
  11900. Q := P;
  11901. L := Len;
  11902. Result := 0;
  11903. if not Assigned(Q) then
  11904. exit;
  11905. while L > 0 do
  11906. begin
  11907. if M(Q^) then
  11908. Inc(Result);
  11909. Inc(Q);
  11910. Dec(L);
  11911. end;
  11912. end;
  11913. function StrPMatchCharA(const P: PAnsiChar; const Len: Integer; const M: CharSet): Boolean;
  11914. begin
  11915. Result := StrPMatchLenA(P, Len, M) = Len;
  11916. end;
  11917. function StrPMatchCharW(const P: PWideChar; const Len: Integer; const M: CharSet): Boolean;
  11918. begin
  11919. Result := StrPMatchLenW(P, Len, M) = Len;
  11920. end;
  11921. function StrPMatchCharW(const P: PWideChar; const Len: Integer; const M: TWideCharMatchFunction): Boolean;
  11922. begin
  11923. Result := StrPMatchLenW(P, Len, M) = Len;
  11924. end;
  11925. function StrPMatchChar(const P: PChar; const Len: Integer; const M: CharSet): Boolean;
  11926. begin
  11927. Result := StrPMatchLen(P, Len, M) = Len;
  11928. end;
  11929. {$ENDIF}
  11930. {$IFDEF CLR}
  11931. function StrMatchA(const S, M: AnsiString; const Index: Integer): Boolean;
  11932. var N, T, I : Integer;
  11933. begin
  11934. N := Length(M);
  11935. T := Length(S);
  11936. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  11937. begin
  11938. Result := False;
  11939. exit;
  11940. end;
  11941. for I := 1 to N do
  11942. if M[I] <> S[I + Index - 1] then
  11943. begin
  11944. Result := False;
  11945. exit;
  11946. end;
  11947. Result := True;
  11948. end;
  11949. {$ELSE}
  11950. function StrMatchA(const S, M: AnsiString; const Index: Integer): Boolean;
  11951. var N, T : Integer;
  11952. Q : PAnsiChar;
  11953. begin
  11954. N := Length(M);
  11955. T := Length(S);
  11956. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  11957. begin
  11958. Result := False;
  11959. exit;
  11960. end;
  11961. Q := Pointer(S);
  11962. Inc(Q, Index - 1);
  11963. Result := StrPMatchA(Pointer(M), Q, N);
  11964. end;
  11965. {$ENDIF}
  11966. function StrMatchW(const S, M: WideString; const Index: Integer): Boolean;
  11967. var N, T, I : Integer;
  11968. begin
  11969. N := Length(M);
  11970. T := Length(S);
  11971. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  11972. begin
  11973. Result := False;
  11974. exit;
  11975. end;
  11976. for I := 1 to N do
  11977. if M[I] <> S[I + Index - 1] then
  11978. begin
  11979. Result := False;
  11980. exit;
  11981. end;
  11982. Result := True;
  11983. end;
  11984. function StrMatchAW(const S: WideString; const M: AnsiString; const Index: Integer): Boolean;
  11985. var N, T, I : Integer;
  11986. begin
  11987. N := Length(M);
  11988. T := Length(S);
  11989. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  11990. begin
  11991. Result := False;
  11992. exit;
  11993. end;
  11994. for I := 1 to N do
  11995. if Ord(M[I]) <> Ord(S[I + Index - 1]) then
  11996. begin
  11997. Result := False;
  11998. exit;
  11999. end;
  12000. Result := True;
  12001. end;
  12002. function StrMatchU(const S, M: UnicodeString; const Index: Integer): Boolean;
  12003. var N, T, I : Integer;
  12004. begin
  12005. N := Length(M);
  12006. T := Length(S);
  12007. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12008. begin
  12009. Result := False;
  12010. exit;
  12011. end;
  12012. for I := 1 to N do
  12013. if M[I] <> S[I + Index - 1] then
  12014. begin
  12015. Result := False;
  12016. exit;
  12017. end;
  12018. Result := True;
  12019. end;
  12020. function StrMatchAU(const S: UnicodeString; const M: AnsiString; const Index: Integer): Boolean;
  12021. var N, T, I : Integer;
  12022. begin
  12023. N := Length(M);
  12024. T := Length(S);
  12025. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12026. begin
  12027. Result := False;
  12028. exit;
  12029. end;
  12030. for I := 1 to N do
  12031. if Ord(M[I]) <> Ord(S[I + Index - 1]) then
  12032. begin
  12033. Result := False;
  12034. exit;
  12035. end;
  12036. Result := True;
  12037. end;
  12038. function StrMatch(const S, M: String; const Index: Integer): Boolean;
  12039. var N, T, I : Integer;
  12040. begin
  12041. N := Length(M);
  12042. T := Length(S);
  12043. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12044. begin
  12045. Result := False;
  12046. exit;
  12047. end;
  12048. for I := 1 to N do
  12049. if M[I] <> S[I + Index - 1] then
  12050. begin
  12051. Result := False;
  12052. exit;
  12053. end;
  12054. Result := True;
  12055. end;
  12056. {$IFDEF CLR}
  12057. function StrMatchNoCase(const S, M: AnsiString; const Index: Integer): Boolean;
  12058. var N, T, I : Integer;
  12059. begin
  12060. N := Length(M);
  12061. T := Length(S);
  12062. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12063. begin
  12064. Result := False;
  12065. exit;
  12066. end;
  12067. for I := 1 to N do
  12068. if AsciiLowCaseLookup[M[I]] <> AsciiLowCaseLookup[S[I + Index - 1]] then
  12069. begin
  12070. Result := False;
  12071. exit;
  12072. end;
  12073. Result := True;
  12074. end;
  12075. {$ELSE}
  12076. function StrMatchNoAsciiCaseA(const S, M: AnsiString; const Index: Integer): Boolean;
  12077. var N, T : Integer;
  12078. Q : PAnsiChar;
  12079. begin
  12080. N := Length(M);
  12081. T := Length(S);
  12082. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12083. begin
  12084. Result := False;
  12085. exit;
  12086. end;
  12087. Q := Pointer(S);
  12088. Inc(Q, Index - 1);
  12089. Result := StrPMatchNoAsciiCaseA(Pointer(M), Q, N);
  12090. end;
  12091. function StrMatchNoAsciiCaseW(const S, M: WideString; const Index: Integer): Boolean;
  12092. var N, T : Integer;
  12093. Q : PWideChar;
  12094. begin
  12095. N := Length(M);
  12096. T := Length(S);
  12097. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12098. begin
  12099. Result := False;
  12100. exit;
  12101. end;
  12102. Q := Pointer(S);
  12103. Inc(Q, Index - 1);
  12104. Result := StrPMatchNoAsciiCaseW(Pointer(M), Q, N);
  12105. end;
  12106. function StrMatchNoAsciiCaseAW(const S: WideString; const M: AnsiString; const Index: Integer): Boolean;
  12107. var N, T : Integer;
  12108. Q : PWideChar;
  12109. begin
  12110. N := Length(M);
  12111. T := Length(S);
  12112. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12113. begin
  12114. Result := False;
  12115. exit;
  12116. end;
  12117. Q := Pointer(S);
  12118. Inc(Q, Index - 1);
  12119. Result := StrPMatchNoAsciiCaseAW(Q, Pointer(M), N);
  12120. end;
  12121. function StrMatchNoAsciiCaseU(const S, M: UnicodeString; const Index: Integer): Boolean;
  12122. var N, T : Integer;
  12123. Q : PWideChar;
  12124. begin
  12125. N := Length(M);
  12126. T := Length(S);
  12127. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12128. begin
  12129. Result := False;
  12130. exit;
  12131. end;
  12132. Q := Pointer(S);
  12133. Inc(Q, Index - 1);
  12134. Result := StrPMatchNoAsciiCaseW(Pointer(M), Q, N);
  12135. end;
  12136. function StrMatchNoAsciiCaseAU(const S: UnicodeString; const M: AnsiString; const Index: Integer): Boolean;
  12137. var N, T : Integer;
  12138. Q : PWideChar;
  12139. begin
  12140. N := Length(M);
  12141. T := Length(S);
  12142. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12143. begin
  12144. Result := False;
  12145. exit;
  12146. end;
  12147. Q := Pointer(S);
  12148. Inc(Q, Index - 1);
  12149. Result := StrPMatchNoAsciiCaseAW(Q, Pointer(M), N);
  12150. end;
  12151. function StrMatchNoAsciiCase(const S, M: String; const Index: Integer = 1): Boolean;
  12152. var N, T : Integer;
  12153. Q : PChar;
  12154. begin
  12155. N := Length(M);
  12156. T := Length(S);
  12157. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12158. begin
  12159. Result := False;
  12160. exit;
  12161. end;
  12162. Q := Pointer(S);
  12163. Inc(Q, Index - 1);
  12164. Result := StrPMatchNoAsciiCase(Pointer(M), Q, N);
  12165. end;
  12166. function StrMatchNoUnicodeCaseW(const S, M: WideString; const Index: Integer): Boolean;
  12167. var N, T : Integer;
  12168. Q : PWideChar;
  12169. begin
  12170. N := Length(M);
  12171. T := Length(S);
  12172. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12173. begin
  12174. Result := False;
  12175. exit;
  12176. end;
  12177. Q := Pointer(S);
  12178. Inc(Q, Index - 1);
  12179. Result := StrPMatchNoUnicodeCaseW(Pointer(M), Q, N);
  12180. end;
  12181. function StrMatchNoUnicodeCaseU(const S, M: UnicodeString; const Index: Integer): Boolean;
  12182. var N, T : Integer;
  12183. Q : PWideChar;
  12184. begin
  12185. N := Length(M);
  12186. T := Length(S);
  12187. if (N = 0) or (T = 0) or (Index < 1) or (Index + N - 1 > T) then
  12188. begin
  12189. Result := False;
  12190. exit;
  12191. end;
  12192. Q := Pointer(S);
  12193. Inc(Q, Index - 1);
  12194. Result := StrPMatchNoUnicodeCaseW(Pointer(M), Q, N);
  12195. end;
  12196. {$ENDIF}
  12197. function StrMatchLeftA(const S, M: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  12198. begin
  12199. if AsciiCaseSensitive then
  12200. Result := StrMatchA(S, M, 1)
  12201. else
  12202. Result := StrMatchNoAsciiCaseA(S, M, 1);
  12203. end;
  12204. function StrMatchLeftW(const S, M: WideString; const AsciiCaseSensitive: Boolean): Boolean;
  12205. begin
  12206. if AsciiCaseSensitive then
  12207. Result := StrMatchW(S, M, 1)
  12208. else
  12209. Result := StrMatchNoAsciiCaseW(S, M, 1);
  12210. end;
  12211. function StrMatchLeftAW(const S: WideString; const M: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  12212. begin
  12213. if AsciiCaseSensitive then
  12214. Result := StrMatchAW(S, M, 1)
  12215. else
  12216. Result := StrMatchNoAsciiCaseAW(S, M, 1);
  12217. end;
  12218. function StrMatchLeftU(const S, M: UnicodeString; const AsciiCaseSensitive: Boolean): Boolean;
  12219. begin
  12220. if AsciiCaseSensitive then
  12221. Result := StrMatchU(S, M, 1)
  12222. else
  12223. Result := StrMatchNoAsciiCaseU(S, M, 1);
  12224. end;
  12225. function StrMatchLeftAU(const S: UnicodeString; const M: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  12226. begin
  12227. if AsciiCaseSensitive then
  12228. Result := StrMatchAU(S, M, 1)
  12229. else
  12230. Result := StrMatchNoAsciiCaseAU(S, M, 1);
  12231. end;
  12232. function StrMatchLeft(const S, M: String; const AsciiCaseSensitive: Boolean): Boolean;
  12233. begin
  12234. if AsciiCaseSensitive then
  12235. Result := StrMatch(S, M, 1)
  12236. else
  12237. Result := StrMatchNoAsciiCase(S, M, 1);
  12238. end;
  12239. function StrMatchRightA(const S, M: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  12240. var I: Integer;
  12241. begin
  12242. I := Length(S) - Length(M) + 1;
  12243. if AsciiCaseSensitive then
  12244. Result := StrMatchA(S, M, I)
  12245. else
  12246. Result := StrMatchNoAsciiCaseA(S, M, I);
  12247. end;
  12248. function StrMatchRightW(const S, M: WideString; const AsciiCaseSensitive: Boolean): Boolean;
  12249. var I: Integer;
  12250. begin
  12251. I := Length(S) - Length(M) + 1;
  12252. if AsciiCaseSensitive then
  12253. Result := StrMatchW(S, M, I)
  12254. else
  12255. Result := StrMatchNoAsciiCaseW(S, M, I);
  12256. end;
  12257. function StrMatchRightAW(const S: WideString; const M: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  12258. var I: Integer;
  12259. begin
  12260. I := Length(S) - Length(M) + 1;
  12261. if AsciiCaseSensitive then
  12262. Result := StrMatchAW(S, M, I)
  12263. else
  12264. Result := StrMatchNoAsciiCaseAW(S, M, I);
  12265. end;
  12266. function StrMatchRightU(const S, M: UnicodeString; const AsciiCaseSensitive: Boolean): Boolean;
  12267. var I: Integer;
  12268. begin
  12269. I := Length(S) - Length(M) + 1;
  12270. if AsciiCaseSensitive then
  12271. Result := StrMatchU(S, M, I)
  12272. else
  12273. Result := StrMatchNoAsciiCaseU(S, M, I);
  12274. end;
  12275. function StrMatchRightAU(const S: UnicodeString; const M: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  12276. var I: Integer;
  12277. begin
  12278. I := Length(S) - Length(M) + 1;
  12279. if AsciiCaseSensitive then
  12280. Result := StrMatchAU(S, M, I)
  12281. else
  12282. Result := StrMatchNoAsciiCaseAU(S, M, I);
  12283. end;
  12284. function StrMatchRight(const S, M: String; const AsciiCaseSensitive: Boolean): Boolean;
  12285. var I: Integer;
  12286. begin
  12287. I := Length(S) - Length(M) + 1;
  12288. if AsciiCaseSensitive then
  12289. Result := StrMatch(S, M, I)
  12290. else
  12291. Result := StrMatchNoAsciiCase(S, M, I);
  12292. end;
  12293. {$IFDEF CLR}
  12294. function StrMatchLen(const S: AnsiString; const M: CharSet;
  12295. const Index: Integer): Integer;
  12296. var L, I : Integer;
  12297. J : Integer;
  12298. begin
  12299. I := Index;
  12300. if I <= 0 then
  12301. I := 1;
  12302. L := Length(S);
  12303. if I > L then
  12304. Result := 0
  12305. else
  12306. begin
  12307. Result := 0;
  12308. for J := 1 to L - I + 1 do
  12309. if S[I + J - 1] in M then
  12310. Inc(Result)
  12311. else
  12312. exit;
  12313. end;
  12314. end;
  12315. {$ELSE}
  12316. function StrMatchLenA(const S: AnsiString; const M: CharSet; const Index: Integer): Integer;
  12317. var P : PAnsiChar;
  12318. L, I : Integer;
  12319. begin
  12320. I := Index;
  12321. if I <= 0 then
  12322. I := 1;
  12323. L := Length(S);
  12324. if I > L then
  12325. Result := 0
  12326. else
  12327. begin
  12328. P := Pointer(S);
  12329. Dec(I);
  12330. Inc(P, I);
  12331. Result := StrPMatchLenA(P, L - I, M);
  12332. end;
  12333. end;
  12334. function StrMatchLenW(const S: WideString; const M: CharSet; const Index: Integer): Integer;
  12335. var P : PWideChar;
  12336. L, I : Integer;
  12337. begin
  12338. I := Index;
  12339. if I <= 0 then
  12340. I := 1;
  12341. L := Length(S);
  12342. if I > L then
  12343. Result := 0
  12344. else
  12345. begin
  12346. P := Pointer(S);
  12347. Dec(I);
  12348. Inc(P, I);
  12349. Result := StrPMatchLenW(P, L - I, M);
  12350. end;
  12351. end;
  12352. function StrMatchLenW(const S: WideString; const M: TWideCharMatchFunction; const Index: Integer): Integer;
  12353. var P : PWideChar;
  12354. L, I : Integer;
  12355. begin
  12356. I := Index;
  12357. if I <= 0 then
  12358. I := 1;
  12359. L := Length(S);
  12360. if I > L then
  12361. Result := 0
  12362. else
  12363. begin
  12364. P := Pointer(S);
  12365. Dec(I);
  12366. Inc(P, I);
  12367. Result := StrPMatchLenW(P, L - I, M);
  12368. end;
  12369. end;
  12370. function StrMatchLenU(const S: UnicodeString; const M: CharSet; const Index: Integer): Integer;
  12371. var P : PWideChar;
  12372. L, I : Integer;
  12373. begin
  12374. I := Index;
  12375. if I <= 0 then
  12376. I := 1;
  12377. L := Length(S);
  12378. if I > L then
  12379. Result := 0
  12380. else
  12381. begin
  12382. P := Pointer(S);
  12383. Dec(I);
  12384. Inc(P, I);
  12385. Result := StrPMatchLenW(P, L - I, M);
  12386. end;
  12387. end;
  12388. function StrMatchLenU(const S: UnicodeString; const M: TWideCharMatchFunction; const Index: Integer = 1): Integer;
  12389. var P : PWideChar;
  12390. L, I : Integer;
  12391. begin
  12392. I := Index;
  12393. if I <= 0 then
  12394. I := 1;
  12395. L := Length(S);
  12396. if I > L then
  12397. Result := 0
  12398. else
  12399. begin
  12400. P := Pointer(S);
  12401. Dec(I);
  12402. Inc(P, I);
  12403. Result := StrPMatchLenW(P, L - I, M);
  12404. end;
  12405. end;
  12406. function StrMatchLen(const S: String; const M: CharSet; const Index: Integer): Integer;
  12407. var P : PChar;
  12408. L, I : Integer;
  12409. begin
  12410. I := Index;
  12411. if I <= 0 then
  12412. I := 1;
  12413. L := Length(S);
  12414. if I > L then
  12415. Result := 0
  12416. else
  12417. begin
  12418. P := Pointer(S);
  12419. Dec(I);
  12420. Inc(P, I);
  12421. Result := StrPMatchLen(P, L - I, M);
  12422. end;
  12423. end;
  12424. {$ENDIF}
  12425. {$IFDEF CLR}
  12426. function StrMatchCharA(const S: AnsiString; const M: CharSet): Boolean;
  12427. var L: Integer;
  12428. begin
  12429. L := Length(S);
  12430. Result := (L > 0) and (StrMatchLen(S, M, 1) = L);
  12431. end;
  12432. {$ELSE}
  12433. function StrMatchCharA(const S: AnsiString; const M: CharSet): Boolean;
  12434. var L: Integer;
  12435. begin
  12436. L := Length(S);
  12437. Result := (L > 0) and (StrPMatchLenA(Pointer(S), L, M) = L);
  12438. end;
  12439. function StrMatchCharW(const S: WideString; const M: CharSet): Boolean;
  12440. var L: Integer;
  12441. begin
  12442. L := Length(S);
  12443. Result := (L > 0) and (StrPMatchLenW(Pointer(S), L, M) = L);
  12444. end;
  12445. function StrMatchCharW(const S: WideString; const M: TWideCharMatchFunction): Boolean;
  12446. var L: Integer;
  12447. begin
  12448. L := Length(S);
  12449. Result := (L > 0) and (StrPMatchLenW(Pointer(S), L, M) = L);
  12450. end;
  12451. function StrMatchCharU(const S: UnicodeString; const M: CharSet): Boolean;
  12452. var L: Integer;
  12453. begin
  12454. L := Length(S);
  12455. Result := (L > 0) and (StrPMatchLenW(Pointer(S), L, M) = L);
  12456. end;
  12457. function StrMatchCharU(const S: UnicodeString; const M: TWideCharMatchFunction): Boolean;
  12458. var L: Integer;
  12459. begin
  12460. L := Length(S);
  12461. Result := (L > 0) and (StrPMatchLenW(Pointer(S), L, M) = L);
  12462. end;
  12463. function StrMatchChar(const S: String; const M: CharSet): Boolean;
  12464. var L: Integer;
  12465. begin
  12466. L := Length(S);
  12467. Result := (L > 0) and (StrPMatchLen(Pointer(S), L, M) = L);
  12468. end;
  12469. {$ENDIF}
  12470. {$IFNDEF ManagedCode}
  12471. function StrZMatchLenA(const P: PAnsiChar; const M: CharSet; const MaxLen: Integer): Integer;
  12472. var Q : PAnsiChar;
  12473. L : Integer;
  12474. C : AnsiChar;
  12475. begin
  12476. Q := P;
  12477. L := MaxLen;
  12478. Result := 0;
  12479. if not Assigned(Q) then
  12480. exit;
  12481. while L <> 0 do
  12482. begin
  12483. C := Q^;
  12484. if C = #0 then
  12485. exit;
  12486. if C in M then
  12487. begin
  12488. Inc(Q);
  12489. if L > 0 then
  12490. Dec(L);
  12491. Inc(Result);
  12492. end
  12493. else
  12494. exit;
  12495. end;
  12496. end;
  12497. function StrZMatchLenW(const P: PWideChar; const M: CharSet; const MaxLen: Integer): Integer;
  12498. var Q : PWideChar;
  12499. L : Integer;
  12500. C : WideChar;
  12501. begin
  12502. Q := P;
  12503. L := MaxLen;
  12504. Result := 0;
  12505. if not Assigned(Q) then
  12506. exit;
  12507. while L <> 0 do
  12508. begin
  12509. C := Q^;
  12510. if C = #0 then
  12511. exit;
  12512. if WideCharInCharSet(C, M) then
  12513. begin
  12514. Inc(Q);
  12515. if L > 0 then
  12516. Dec(L);
  12517. Inc(Result);
  12518. end
  12519. else
  12520. exit;
  12521. end;
  12522. end;
  12523. function StrZMatchLenW(const P: PWideChar; const M: TWideCharMatchFunction; const MaxLen: Integer): Integer;
  12524. var Q : PWideChar;
  12525. L : Integer;
  12526. C : WideChar;
  12527. begin
  12528. Q := P;
  12529. L := MaxLen;
  12530. Result := 0;
  12531. if not Assigned(Q) then
  12532. exit;
  12533. while L <> 0 do
  12534. begin
  12535. C := Q^;
  12536. if C = #0 then
  12537. exit;
  12538. if M(C) then
  12539. begin
  12540. Inc(Q);
  12541. if L > 0 then
  12542. Dec(L);
  12543. Inc(Result);
  12544. end
  12545. else
  12546. exit;
  12547. end;
  12548. end;
  12549. function StrZMatchStrA(const P: PAnsiChar; const M: AnsiString): Boolean;
  12550. var T, Q : PAnsiChar;
  12551. I, L : Integer;
  12552. C : AnsiChar;
  12553. begin
  12554. L := Length(M);
  12555. if L = 0 then
  12556. begin
  12557. Result := False;
  12558. exit;
  12559. end;
  12560. T := P;
  12561. Q := Pointer(M);
  12562. for I := 1 to L do
  12563. begin
  12564. C := T^;
  12565. if (C = #0) or (C <> Q^) then
  12566. begin
  12567. Result := False;
  12568. exit;
  12569. end else
  12570. begin
  12571. Inc(T);
  12572. Inc(Q);
  12573. end;
  12574. end;
  12575. Result := True;
  12576. end;
  12577. function StrZMatchStrW(const P: PWideChar; const M: WideString): Boolean;
  12578. var T, Q : PWideChar;
  12579. I, L : Integer;
  12580. C : WideChar;
  12581. begin
  12582. L := Length(M);
  12583. if L = 0 then
  12584. begin
  12585. Result := False;
  12586. exit;
  12587. end;
  12588. T := P;
  12589. Q := Pointer(M);
  12590. for I := 1 to L do
  12591. begin
  12592. C := T^;
  12593. if (C = #0) or (C <> Q^) then
  12594. begin
  12595. Result := False;
  12596. exit;
  12597. end else
  12598. begin
  12599. Inc(T);
  12600. Inc(Q);
  12601. end;
  12602. end;
  12603. Result := True;
  12604. end;
  12605. function StrZMatchStrAW(const P: PWideChar; const M: AnsiString): Boolean;
  12606. var T : PWideChar;
  12607. Q : PAnsiChar;
  12608. I, L : Integer;
  12609. C : WideChar;
  12610. begin
  12611. L := Length(M);
  12612. if L = 0 then
  12613. begin
  12614. Result := False;
  12615. exit;
  12616. end;
  12617. T := P;
  12618. Q := Pointer(M);
  12619. for I := 1 to L do
  12620. begin
  12621. C := T^;
  12622. if (C = #0) or (Ord(C) <> Ord(Q^)) then
  12623. begin
  12624. Result := False;
  12625. exit;
  12626. end else
  12627. begin
  12628. Inc(T);
  12629. Inc(Q);
  12630. end;
  12631. end;
  12632. Result := True;
  12633. end;
  12634. function StrZMatchStrU(const P: PWideChar; const M: UnicodeString): Boolean;
  12635. var T, Q : PWideChar;
  12636. I, L : Integer;
  12637. C : WideChar;
  12638. begin
  12639. L := Length(M);
  12640. if L = 0 then
  12641. begin
  12642. Result := False;
  12643. exit;
  12644. end;
  12645. T := P;
  12646. Q := Pointer(M);
  12647. for I := 1 to L do
  12648. begin
  12649. C := T^;
  12650. if (C = #0) or (C <> Q^) then
  12651. begin
  12652. Result := False;
  12653. exit;
  12654. end else
  12655. begin
  12656. Inc(T);
  12657. Inc(Q);
  12658. end;
  12659. end;
  12660. Result := True;
  12661. end;
  12662. function StrZMatchStr(const P: PChar; const M: String): Boolean;
  12663. var T, Q : PChar;
  12664. I, L : Integer;
  12665. C : Char;
  12666. begin
  12667. L := Length(M);
  12668. if L = 0 then
  12669. begin
  12670. Result := False;
  12671. exit;
  12672. end;
  12673. T := P;
  12674. Q := Pointer(M);
  12675. for I := 1 to L do
  12676. begin
  12677. C := T^;
  12678. if (C = #0) or (C <> Q^) then
  12679. begin
  12680. Result := False;
  12681. exit;
  12682. end else
  12683. begin
  12684. Inc(T);
  12685. Inc(Q);
  12686. end;
  12687. end;
  12688. Result := True;
  12689. end;
  12690. function StrZMatchStrNoAsciiCaseA(const P: PAnsiChar; const M: AnsiString): Boolean;
  12691. var T, Q : PAnsiChar;
  12692. I, L : Integer;
  12693. C, D : AnsiChar;
  12694. begin
  12695. L := Length(M);
  12696. if L = 0 then
  12697. begin
  12698. Result := False;
  12699. exit;
  12700. end;
  12701. T := P;
  12702. Q := Pointer(M);
  12703. for I := 1 to L do
  12704. begin
  12705. C := T^;
  12706. if C = #0 then
  12707. begin
  12708. Result := False;
  12709. exit;
  12710. end;
  12711. D := Q^;
  12712. if C <> D then
  12713. begin
  12714. C := AsciiLowCaseLookup[C];
  12715. D := AsciiLowCaseLookup[D];
  12716. if C <> D then
  12717. begin
  12718. Result := False;
  12719. exit;
  12720. end;
  12721. end;
  12722. Inc(T);
  12723. Inc(Q);
  12724. end;
  12725. Result := True;
  12726. end;
  12727. function StrZMatchStrNoAsciiCaseW(const P: PWideChar; const M: WideString): Boolean;
  12728. var T, Q : PWideChar;
  12729. I, L : Integer;
  12730. C, D : WideChar;
  12731. E, F : AnsiChar;
  12732. begin
  12733. L := Length(M);
  12734. if L = 0 then
  12735. begin
  12736. Result := False;
  12737. exit;
  12738. end;
  12739. T := P;
  12740. Q := Pointer(M);
  12741. for I := 1 to L do
  12742. begin
  12743. C := T^;
  12744. if C = #0 then
  12745. begin
  12746. Result := False;
  12747. exit;
  12748. end;
  12749. D := Q^;
  12750. if C <> D then
  12751. begin
  12752. if (Ord(C) >= $80) or (Ord(D) >= $80) then
  12753. begin
  12754. Result := False;
  12755. exit;
  12756. end;
  12757. E := AsciiLowCaseLookup[AnsiChar(Ord(C))];
  12758. F := AsciiLowCaseLookup[AnsiChar(Ord(D))];
  12759. if E <> F then
  12760. begin
  12761. Result := False;
  12762. exit;
  12763. end;
  12764. end;
  12765. Inc(T);
  12766. Inc(Q);
  12767. end;
  12768. Result := True;
  12769. end;
  12770. function StrZMatchStrNoAsciiCaseAW(const P: PWideChar; const M: AnsiString): Boolean;
  12771. var T : PWideChar;
  12772. Q : PAnsiChar;
  12773. I, L : Integer;
  12774. C : WideChar;
  12775. D : AnsiChar;
  12776. E, F : AnsiChar;
  12777. begin
  12778. L := Length(M);
  12779. if L = 0 then
  12780. begin
  12781. Result := False;
  12782. exit;
  12783. end;
  12784. T := P;
  12785. Q := Pointer(M);
  12786. for I := 1 to L do
  12787. begin
  12788. C := T^;
  12789. if C = #0 then
  12790. begin
  12791. Result := False;
  12792. exit;
  12793. end;
  12794. D := Q^;
  12795. if Ord(C) <> Ord(D) then
  12796. begin
  12797. if (Ord(C) >= $80) or (Ord(D) >= $80) then
  12798. begin
  12799. Result := False;
  12800. exit;
  12801. end;
  12802. E := AsciiLowCaseLookup[AnsiChar(Ord(C))];
  12803. F := AsciiLowCaseLookup[D];
  12804. if E <> F then
  12805. begin
  12806. Result := False;
  12807. exit;
  12808. end;
  12809. end;
  12810. Inc(T);
  12811. Inc(Q);
  12812. end;
  12813. Result := True;
  12814. end;
  12815. function StrZMatchStrNoAsciiCaseU(const P: PWideChar; const M: UnicodeString): Boolean;
  12816. var T, Q : PWideChar;
  12817. I, L : Integer;
  12818. C, D : WideChar;
  12819. E, F : AnsiChar;
  12820. begin
  12821. L := Length(M);
  12822. if L = 0 then
  12823. begin
  12824. Result := False;
  12825. exit;
  12826. end;
  12827. T := P;
  12828. Q := Pointer(M);
  12829. for I := 1 to L do
  12830. begin
  12831. C := T^;
  12832. if C = #0 then
  12833. begin
  12834. Result := False;
  12835. exit;
  12836. end;
  12837. D := Q^;
  12838. if C <> D then
  12839. begin
  12840. if (Ord(C) >= $80) or (Ord(D) >= $80) then
  12841. begin
  12842. Result := False;
  12843. exit;
  12844. end;
  12845. E := AsciiLowCaseLookup[AnsiChar(Ord(C))];
  12846. F := AsciiLowCaseLookup[AnsiChar(Ord(D))];
  12847. if E <> F then
  12848. begin
  12849. Result := False;
  12850. exit;
  12851. end;
  12852. end;
  12853. Inc(T);
  12854. Inc(Q);
  12855. end;
  12856. Result := True;
  12857. end;
  12858. function StrZMatchStrNoAsciiCase(const P: PChar; const M: String): Boolean;
  12859. var T, Q : PChar;
  12860. I, L : Integer;
  12861. C, D : Char;
  12862. E, F : AnsiChar;
  12863. begin
  12864. L := Length(M);
  12865. if L = 0 then
  12866. begin
  12867. Result := False;
  12868. exit;
  12869. end;
  12870. T := P;
  12871. Q := Pointer(M);
  12872. for I := 1 to L do
  12873. begin
  12874. C := T^;
  12875. if C = #0 then
  12876. begin
  12877. Result := False;
  12878. exit;
  12879. end;
  12880. D := Q^;
  12881. if C <> D then
  12882. begin
  12883. {$IFDEF StringIsUnicode}
  12884. if (Ord(C) >= $80) or (Ord(D) >= $80) then
  12885. begin
  12886. Result := False;
  12887. exit;
  12888. end;
  12889. {$ENDIF}
  12890. E := AsciiLowCaseLookup[AnsiChar(Ord(C))];
  12891. F := AsciiLowCaseLookup[AnsiChar(Ord(D))];
  12892. if E <> F then
  12893. begin
  12894. Result := False;
  12895. exit;
  12896. end;
  12897. end;
  12898. Inc(T);
  12899. Inc(Q);
  12900. end;
  12901. Result := True;
  12902. end;
  12903. function StrZMatchStrNoUnicodeCaseW(const P: PWideChar; const M: WideString): Boolean;
  12904. var T, Q : PWideChar;
  12905. I, L : Integer;
  12906. C, D : WideChar;
  12907. begin
  12908. L := Length(M);
  12909. if L = 0 then
  12910. begin
  12911. Result := False;
  12912. exit;
  12913. end;
  12914. T := P;
  12915. Q := Pointer(M);
  12916. for I := 1 to L do
  12917. begin
  12918. C := T^;
  12919. if C = #0 then
  12920. begin
  12921. Result := False;
  12922. exit;
  12923. end;
  12924. D := Q^;
  12925. if not UnicodeCharIsEqualNoCase(C, D) then
  12926. begin
  12927. Result := False;
  12928. exit;
  12929. end;
  12930. Inc(T);
  12931. Inc(Q);
  12932. end;
  12933. Result := True;
  12934. end;
  12935. function StrZMatchStrNoUnicodeCaseU(const P: PWideChar; const M: UnicodeString): Boolean;
  12936. var T, Q : PWideChar;
  12937. I, L : Integer;
  12938. C, D : WideChar;
  12939. begin
  12940. L := Length(M);
  12941. if L = 0 then
  12942. begin
  12943. Result := False;
  12944. exit;
  12945. end;
  12946. T := P;
  12947. Q := Pointer(M);
  12948. for I := 1 to L do
  12949. begin
  12950. C := T^;
  12951. if C = #0 then
  12952. begin
  12953. Result := False;
  12954. exit;
  12955. end;
  12956. D := Q^;
  12957. if not UnicodeCharIsEqualNoCase(C, D) then
  12958. begin
  12959. Result := False;
  12960. exit;
  12961. end;
  12962. Inc(T);
  12963. Inc(Q);
  12964. end;
  12965. Result := True;
  12966. end;
  12967. function StrZMatchStrAsciiA(const P: PAnsiChar; const M: AnsiString;
  12968. const AsciiCaseSensitive: Boolean): Boolean;
  12969. begin
  12970. if AsciiCaseSensitive then
  12971. Result := StrZMatchStrA(P, M)
  12972. else
  12973. Result := StrZMatchStrNoAsciiCaseA(P, M);
  12974. end;
  12975. function StrZMatchStrAsciiW(const P: PWideChar; const M: WideString;
  12976. const AsciiCaseSensitive: Boolean): Boolean;
  12977. begin
  12978. if AsciiCaseSensitive then
  12979. Result := StrZMatchStrW(P, M)
  12980. else
  12981. Result := StrZMatchStrNoAsciiCaseW(P, M);
  12982. end;
  12983. function StrZMatchStrAsciiAW(const P: PWideChar; const M: AnsiString;
  12984. const AsciiCaseSensitive: Boolean): Boolean;
  12985. begin
  12986. if AsciiCaseSensitive then
  12987. Result := StrZMatchStrAW(P, M)
  12988. else
  12989. Result := StrZMatchStrNoAsciiCaseAW(P, M);
  12990. end;
  12991. function StrZMatchStrAsciiU(const P: PWideChar; const M: UnicodeString;
  12992. const AsciiCaseSensitive: Boolean): Boolean;
  12993. begin
  12994. if AsciiCaseSensitive then
  12995. Result := StrZMatchStrU(P, M)
  12996. else
  12997. Result := StrZMatchStrNoAsciiCaseU(P, M);
  12998. end;
  12999. function StrZMatchStrAscii(const P: PChar; const M: String; const AsciiCaseSensitive: Boolean): Boolean;
  13000. begin
  13001. if AsciiCaseSensitive then
  13002. Result := StrZMatchStr(P, M)
  13003. else
  13004. Result := StrZMatchStrNoAsciiCase(P, M);
  13005. end;
  13006. function StrZMatchStrUnicodeW(const P: PWideChar; const M: WideString; const UnicodeCaseSensitive: Boolean): Boolean;
  13007. begin
  13008. if UnicodeCaseSensitive then
  13009. Result := StrZMatchStrW(P, M)
  13010. else
  13011. Result := StrZMatchStrNoUnicodeCaseW(P, M);
  13012. end;
  13013. function StrZMatchStrUnicodeU(const P: PWideChar; const M: UnicodeString; const UnicodeCaseSensitive: Boolean): Boolean;
  13014. begin
  13015. if UnicodeCaseSensitive then
  13016. Result := StrZMatchStrU(P, M)
  13017. else
  13018. Result := StrZMatchStrNoUnicodeCaseU(P, M);
  13019. end;
  13020. {$ENDIF}
  13021. { }
  13022. { MatchPattern }
  13023. { }
  13024. {$IFNDEF ManagedCode}
  13025. function StrZMatchPatternA(M, S: PAnsiChar; const G: TMatchPatternGreed): Integer;
  13026. function EscapedChar(const C: AnsiChar): AnsiChar;
  13027. begin
  13028. case C of
  13029. 'b' : Result := AsciiBS;
  13030. 'e' : Result := AsciiESC;
  13031. 'f' : Result := AsciiFF;
  13032. 'n' : Result := AsciiLF;
  13033. 'r' : Result := AsciiCR;
  13034. 't' : Result := AsciiHT;
  13035. 'v' : Result := AsciiVT;
  13036. else Result := C;
  13037. end;
  13038. end;
  13039. var A, C, D : AnsiChar;
  13040. N, R : Boolean;
  13041. L, I : Integer;
  13042. begin
  13043. Result := 0;
  13044. repeat
  13045. case M^ of
  13046. #0 : // end of pattern
  13047. exit;
  13048. '.' : // match exactly one
  13049. if S^ = #0 then
  13050. begin
  13051. Result := -1; // no match
  13052. exit;
  13053. end
  13054. else
  13055. begin
  13056. Inc(M);
  13057. Inc(S);
  13058. Inc(Result);
  13059. end;
  13060. '\' : // escaped character
  13061. if S^ = #0 then
  13062. begin
  13063. Result := -1; // no match
  13064. exit;
  13065. end
  13066. else
  13067. begin
  13068. Inc(M);
  13069. C := M^;
  13070. if C = #0 then
  13071. begin
  13072. Result := -2; // format error
  13073. exit;
  13074. end;
  13075. C := EscapedChar(C);
  13076. if S^ <> C then
  13077. begin
  13078. Result := -1; // no match
  13079. exit;
  13080. end else
  13081. begin
  13082. Inc(M);
  13083. Inc(S);
  13084. Inc(Result);
  13085. end;
  13086. end;
  13087. '?' : // match zero or one
  13088. begin
  13089. Inc(M);
  13090. if M^ = #0 then
  13091. begin
  13092. if G in [mpgGreedy, mpgGreedyNoBacktrack] then
  13093. if S^ <> #0 then
  13094. Inc(Result);
  13095. break;
  13096. end;
  13097. if S^ <> #0 then
  13098. begin
  13099. if G = mpgGreedyNoBacktrack then
  13100. begin
  13101. Inc(S);
  13102. Inc(Result);
  13103. end
  13104. else
  13105. if G = mpgGreedy then
  13106. begin
  13107. Inc(S);
  13108. if S^ = #0 then
  13109. L := -1
  13110. else
  13111. begin
  13112. L := StrZMatchPatternA(M, S, G); // try one
  13113. if L >= 0 then
  13114. Inc(Result, L + 1);
  13115. end;
  13116. if L < 0 then
  13117. begin
  13118. Dec(S);
  13119. L := StrZMatchPatternA(M, S, G); // try zero
  13120. if L > 0 then
  13121. Inc(Result, L);
  13122. end;
  13123. if L < 0 then
  13124. Result := -1; // no match
  13125. exit;
  13126. end
  13127. else
  13128. begin // lazy
  13129. L := StrZMatchPatternA(M, S, G); // try zero
  13130. if L >= 0 then
  13131. Inc(Result, L)
  13132. else
  13133. begin
  13134. Inc(S);
  13135. if S <> #0 then
  13136. begin
  13137. L := StrZMatchPatternA(M, S, G); // try one
  13138. if L >= 0 then
  13139. Inc(Result, L + 1);
  13140. end;
  13141. end;
  13142. if L < 0 then
  13143. Result := -1; // no match
  13144. exit;
  13145. end;
  13146. end;
  13147. end;
  13148. '*' :
  13149. begin
  13150. Inc(M);
  13151. if M^ = #0 then // always match at end of mask
  13152. begin
  13153. if G in [mpgGreedy, mpgGreedyNoBacktrack] then
  13154. while S^ <> #0 do
  13155. begin
  13156. Inc(S);
  13157. Inc(Result);
  13158. end;
  13159. break;
  13160. end
  13161. else
  13162. if S^ <> #0 then
  13163. if G = mpgGreedyNoBacktrack then
  13164. while S^ <> #0 do
  13165. begin
  13166. Inc(S);
  13167. Inc(Result);
  13168. end
  13169. else
  13170. if G = mpgGreedy then
  13171. begin
  13172. // move to end
  13173. I := 0;
  13174. while S^ <> #0 do
  13175. begin
  13176. Inc(S);
  13177. Inc(Result);
  13178. Inc(I);
  13179. end;
  13180. // match from back
  13181. L := 0;
  13182. while I >= 0 do
  13183. begin
  13184. L := StrZMatchPatternA(M, S, G);
  13185. if L >= 0 then
  13186. break
  13187. else
  13188. begin
  13189. Dec(S);
  13190. Dec(Result);
  13191. Dec(I);
  13192. end;
  13193. end;
  13194. if L < 0 then
  13195. Result := -1 // no match
  13196. else
  13197. Inc(Result, L);
  13198. exit;
  13199. end
  13200. else
  13201. // lazy
  13202. begin
  13203. // match from front
  13204. L := 0;
  13205. while S^ <> #0 do
  13206. begin
  13207. L := StrZMatchPatternA(M, S, G);
  13208. if L >= 0 then
  13209. break
  13210. else
  13211. begin
  13212. Inc(S);
  13213. Inc(Result);
  13214. end;
  13215. end;
  13216. if L < 0 then
  13217. Result := -1 // no match
  13218. else
  13219. Inc(Result, L);
  13220. exit;
  13221. end;
  13222. end;
  13223. '[' : // character class
  13224. begin
  13225. A := S^;
  13226. if A = #0 then
  13227. begin
  13228. Result := -1; // no match
  13229. exit;
  13230. end;
  13231. Inc(M);
  13232. C := M^;
  13233. N := C = '^';
  13234. if N then
  13235. begin
  13236. Inc(M);
  13237. C := M^;
  13238. end;
  13239. R := False;
  13240. while C <> ']' do
  13241. begin
  13242. if C = #0 then
  13243. begin
  13244. Result := -2; // format error
  13245. exit;
  13246. end;
  13247. Inc(M);
  13248. if C = '\' then // escaped character
  13249. begin
  13250. C := M^;
  13251. if C = #0 then
  13252. begin
  13253. Result := -2; // format error
  13254. exit;
  13255. end;
  13256. C := EscapedChar(C);
  13257. Inc(M);
  13258. end;
  13259. D := M^;
  13260. if D = '-' then // match range
  13261. begin
  13262. Inc(M);
  13263. D := M^;
  13264. if D = #0 then
  13265. begin
  13266. Result := -2; // format error
  13267. exit;
  13268. end;
  13269. if D = '\' then // escaped character
  13270. begin
  13271. Inc(M);
  13272. D := M^;
  13273. if D = #0 then
  13274. begin
  13275. Result := -2; // format error
  13276. exit;
  13277. end;
  13278. D := EscapedChar(D);
  13279. Inc(M);
  13280. end;
  13281. if (A >= C) and (A <= D) then
  13282. begin
  13283. R := True;
  13284. break;
  13285. end;
  13286. Inc(M);
  13287. C := M^;
  13288. end
  13289. else
  13290. begin // match single character
  13291. if A = C then
  13292. begin
  13293. R := True;
  13294. break;
  13295. end;
  13296. C := D;
  13297. end;
  13298. end;
  13299. if (N and R) or
  13300. (not N and not R) then
  13301. begin
  13302. Result := -1; // no match
  13303. exit;
  13304. end;
  13305. Inc(Result);
  13306. Inc(S);
  13307. // locate closing bracket
  13308. while M^ <> ']' do
  13309. if M^ = #0 then
  13310. begin
  13311. Result := -2; // format error
  13312. exit;
  13313. end
  13314. else
  13315. Inc(M);
  13316. Inc(M);
  13317. end;
  13318. else // single character match
  13319. if M^ <> S^ then
  13320. begin
  13321. Result := -1; // no match
  13322. exit;
  13323. end else
  13324. begin
  13325. Inc(M);
  13326. Inc(S);
  13327. Inc(Result);
  13328. end;
  13329. end;
  13330. until False;
  13331. end;
  13332. function StrZMatchPatternW(M, S: PWideChar; const G: TMatchPatternGreed): Integer;
  13333. function EscapedChar(const C: WideChar): WideChar;
  13334. begin
  13335. case C of
  13336. 'b' : Result := WideBS;
  13337. 'e' : Result := WideESC;
  13338. 'f' : Result := WideFF;
  13339. 'n' : Result := WideLF;
  13340. 'r' : Result := WideCR;
  13341. 't' : Result := WideHT;
  13342. 'v' : Result := WideVT;
  13343. else Result := C;
  13344. end;
  13345. end;
  13346. var A, C, D : WideChar;
  13347. N, R : Boolean;
  13348. L, I : Integer;
  13349. begin
  13350. Result := 0;
  13351. repeat
  13352. case M^ of
  13353. #0 : // end of pattern
  13354. exit;
  13355. '.' : // match exactly one
  13356. if S^ = #0 then
  13357. begin
  13358. Result := -1; // no match
  13359. exit;
  13360. end
  13361. else
  13362. begin
  13363. Inc(M);
  13364. Inc(S);
  13365. Inc(Result);
  13366. end;
  13367. '\' : // escaped character
  13368. if S^ = #0 then
  13369. begin
  13370. Result := -1; // no match
  13371. exit;
  13372. end
  13373. else
  13374. begin
  13375. Inc(M);
  13376. C := M^;
  13377. if C = #0 then
  13378. begin
  13379. Result := -2; // format error
  13380. exit;
  13381. end;
  13382. C := EscapedChar(C);
  13383. if S^ <> C then
  13384. begin
  13385. Result := -1; // no match
  13386. exit;
  13387. end else
  13388. begin
  13389. Inc(M);
  13390. Inc(S);
  13391. Inc(Result);
  13392. end;
  13393. end;
  13394. '?' : // match zero or one
  13395. begin
  13396. Inc(M);
  13397. if M^ = #0 then
  13398. begin
  13399. if G in [mpgGreedy, mpgGreedyNoBacktrack] then
  13400. if S^ <> #0 then
  13401. Inc(Result);
  13402. break;
  13403. end;
  13404. if S^ <> #0 then
  13405. begin
  13406. if G = mpgGreedyNoBacktrack then
  13407. begin
  13408. Inc(S);
  13409. Inc(Result);
  13410. end
  13411. else
  13412. if G = mpgGreedy then
  13413. begin
  13414. Inc(S);
  13415. if S^ = #0 then
  13416. L := -1
  13417. else
  13418. begin
  13419. L := StrZMatchPatternW(M, S, G); // try one
  13420. if L >= 0 then
  13421. Inc(Result, L + 1);
  13422. end;
  13423. if L < 0 then
  13424. begin
  13425. Dec(S);
  13426. L := StrZMatchPatternW(M, S, G); // try zero
  13427. if L > 0 then
  13428. Inc(Result, L);
  13429. end;
  13430. if L < 0 then
  13431. Result := -1; // no match
  13432. exit;
  13433. end
  13434. else
  13435. begin // lazy
  13436. L := StrZMatchPatternW(M, S, G); // try zero
  13437. if L >= 0 then
  13438. Inc(Result, L)
  13439. else
  13440. begin
  13441. Inc(S);
  13442. if S^ <> #0 then
  13443. begin
  13444. L := StrZMatchPatternW(M, S, G); // try one
  13445. if L >= 0 then
  13446. Inc(Result, L + 1);
  13447. end;
  13448. end;
  13449. if L < 0 then
  13450. Result := -1; // no match
  13451. exit;
  13452. end;
  13453. end;
  13454. end;
  13455. '*' :
  13456. begin
  13457. Inc(M);
  13458. if M^ = #0 then // always match at end of mask
  13459. begin
  13460. if G in [mpgGreedy, mpgGreedyNoBacktrack] then
  13461. while S^ <> #0 do
  13462. begin
  13463. Inc(S);
  13464. Inc(Result);
  13465. end;
  13466. break;
  13467. end
  13468. else
  13469. if S^ <> #0 then
  13470. if G = mpgGreedyNoBacktrack then
  13471. while S^ <> #0 do
  13472. begin
  13473. Inc(S);
  13474. Inc(Result);
  13475. end
  13476. else
  13477. if G = mpgGreedy then
  13478. begin
  13479. // move to end
  13480. I := 0;
  13481. while S^ <> #0 do
  13482. begin
  13483. Inc(S);
  13484. Inc(Result);
  13485. Inc(I);
  13486. end;
  13487. // match from back
  13488. L := 0;
  13489. while I >= 0 do
  13490. begin
  13491. L := StrZMatchPatternW(M, S, G);
  13492. if L >= 0 then
  13493. break
  13494. else
  13495. begin
  13496. Dec(S);
  13497. Dec(Result);
  13498. Dec(I);
  13499. end;
  13500. end;
  13501. if L < 0 then
  13502. Result := -1 // no match
  13503. else
  13504. Inc(Result, L);
  13505. exit;
  13506. end
  13507. else
  13508. // lazy
  13509. begin
  13510. // match from front
  13511. L := 0;
  13512. while S^ <> #0 do
  13513. begin
  13514. L := StrZMatchPatternW(M, S, G);
  13515. if L >= 0 then
  13516. break
  13517. else
  13518. begin
  13519. Inc(S);
  13520. Inc(Result);
  13521. end;
  13522. end;
  13523. if L < 0 then
  13524. Result := -1 // no match
  13525. else
  13526. Inc(Result, L);
  13527. exit;
  13528. end;
  13529. end;
  13530. '[' : // character class
  13531. begin
  13532. A := S^;
  13533. if A = #0 then
  13534. begin
  13535. Result := -1; // no match
  13536. exit;
  13537. end;
  13538. Inc(M);
  13539. C := M^;
  13540. N := C = '^';
  13541. if N then
  13542. begin
  13543. Inc(M);
  13544. C := M^;
  13545. end;
  13546. R := False;
  13547. while C <> ']' do
  13548. begin
  13549. if C = #0 then
  13550. begin
  13551. Result := -2; // format error
  13552. exit;
  13553. end;
  13554. Inc(M);
  13555. if C = '\' then // escaped character
  13556. begin
  13557. C := M^;
  13558. if C = #0 then
  13559. begin
  13560. Result := -2; // format error
  13561. exit;
  13562. end;
  13563. C := EscapedChar(C);
  13564. Inc(M);
  13565. end;
  13566. D := M^;
  13567. if D = '-' then // match range
  13568. begin
  13569. Inc(M);
  13570. D := M^;
  13571. if D = #0 then
  13572. begin
  13573. Result := -2; // format error
  13574. exit;
  13575. end;
  13576. if D = '\' then // escaped character
  13577. begin
  13578. Inc(M);
  13579. D := M^;
  13580. if D = #0 then
  13581. begin
  13582. Result := -2; // format error
  13583. exit;
  13584. end;
  13585. D := EscapedChar(D);
  13586. Inc(M);
  13587. end;
  13588. if (A >= C) and (A <= D) then
  13589. begin
  13590. R := True;
  13591. break;
  13592. end;
  13593. Inc(M);
  13594. C := M^;
  13595. end
  13596. else
  13597. begin // match single character
  13598. if A = C then
  13599. begin
  13600. R := True;
  13601. break;
  13602. end;
  13603. C := D;
  13604. end;
  13605. end;
  13606. if (N and R) or
  13607. (not N and not R) then
  13608. begin
  13609. Result := -1; // no match
  13610. exit;
  13611. end;
  13612. Inc(Result);
  13613. Inc(S);
  13614. // locate closing bracket
  13615. while M^ <> ']' do
  13616. if M^ = #0 then
  13617. begin
  13618. Result := -2; // format error
  13619. exit;
  13620. end
  13621. else
  13622. Inc(M);
  13623. Inc(M);
  13624. end;
  13625. else // single character match
  13626. if M^ <> S^ then
  13627. begin
  13628. Result := -1; // no match
  13629. exit;
  13630. end else
  13631. begin
  13632. Inc(M);
  13633. Inc(S);
  13634. Inc(Result);
  13635. end;
  13636. end;
  13637. until False;
  13638. end;
  13639. function StrEqualPatternA(const M, S: AnsiString; const G: TMatchPatternGreed): Boolean;
  13640. begin
  13641. Result := StrZMatchPatternA(PAnsiChar(M), PAnsiChar(S), G) = Length(S);
  13642. end;
  13643. function StrEqualPatternW(const M, S: WideString; const G: TMatchPatternGreed): Boolean;
  13644. begin
  13645. Result := StrZMatchPatternW(PWideChar(M), PWideChar(S), G) = Length(S);
  13646. end;
  13647. function StrEqualPatternU(const M, S: UnicodeString; const G: TMatchPatternGreed): Boolean;
  13648. begin
  13649. Result := StrZMatchPatternW(PWideChar(M), PWideChar(S), G) = Length(S);
  13650. end;
  13651. function StrEqualPattern(const M, S: String; const G: TMatchPatternGreed): Boolean;
  13652. begin
  13653. {$IFDEF StringIsUnicode}
  13654. Result := StrZMatchPatternW(PWideChar(M), PWideChar(S), G) = Length(S);
  13655. {$ELSE}
  13656. Result := StrZMatchPatternA(PAnsiChar(M), PAnsiChar(S), G) = Length(S);
  13657. {$ENDIF}
  13658. end;
  13659. function StrPosPatternA(const F, S: AnsiString; var Len: Integer; const StartIndex: Integer; const G: TMatchPatternGreed): Integer;
  13660. var P : PAnsiChar;
  13661. M : PAnsiChar;
  13662. I : Integer;
  13663. begin
  13664. P := PAnsiChar(S);
  13665. M := PAnsiChar(F);
  13666. for I := MaxI(1, StartIndex) to Length(S) do
  13667. begin
  13668. Len := StrZMatchPatternA(M, P, G);
  13669. if Len >= 0 then
  13670. begin
  13671. Result := I;
  13672. exit;
  13673. end
  13674. else
  13675. Inc(P);
  13676. end;
  13677. Len := 0;
  13678. Result := 0;
  13679. end;
  13680. function StrPosPatternW(const F, S: WideString; var Len: Integer; const StartIndex: Integer; const G: TMatchPatternGreed): Integer;
  13681. var P : PWideChar;
  13682. M : PWideChar;
  13683. I : Integer;
  13684. begin
  13685. P := PWideChar(S);
  13686. M := PWideChar(F);
  13687. for I := MaxI(1, StartIndex) to Length(S) do
  13688. begin
  13689. Len := StrZMatchPatternW(M, P, G);
  13690. if Len >= 0 then
  13691. begin
  13692. Result := I;
  13693. exit;
  13694. end
  13695. else
  13696. Inc(P);
  13697. end;
  13698. Len := 0;
  13699. Result := 0;
  13700. end;
  13701. function StrPosPatternU(const F, S: UnicodeString; var Len: Integer; const StartIndex: Integer; const G: TMatchPatternGreed): Integer;
  13702. var P : PWideChar;
  13703. M : PWideChar;
  13704. I : Integer;
  13705. begin
  13706. P := PWideChar(S);
  13707. M := PWideChar(F);
  13708. for I := MaxI(1, StartIndex) to Length(S) do
  13709. begin
  13710. Len := StrZMatchPatternW(M, P, G);
  13711. if Len >= 0 then
  13712. begin
  13713. Result := I;
  13714. exit;
  13715. end
  13716. else
  13717. Inc(P);
  13718. end;
  13719. Len := 0;
  13720. Result := 0;
  13721. end;
  13722. {$ENDIF}
  13723. { }
  13724. { Equal }
  13725. { }
  13726. {$IFNDEF CLR}
  13727. function StrPEqual(const P1, P2: PAnsiChar; const Len1, Len2: Integer;
  13728. const AsciiCaseSensitive: Boolean): Boolean;
  13729. begin
  13730. Result := Len1 = Len2;
  13731. if not Result or (Len1 = 0) then
  13732. exit;
  13733. if AsciiCaseSensitive then
  13734. Result := StrPMatchA(P1, P2, Len1)
  13735. else
  13736. Result := StrPMatchNoAsciiCaseA(P1, P2, Len1);
  13737. end;
  13738. function StrPEqualStr(const P: PAnsiChar; const Len: Integer; const S: AnsiString;
  13739. const AsciiCaseSensitive: Boolean): Boolean;
  13740. begin
  13741. Result := Len = Length(S);
  13742. if not Result or (Len = 0) then
  13743. exit;
  13744. if AsciiCaseSensitive then
  13745. Result := StrPMatchA(P, Pointer(S), Len)
  13746. else
  13747. Result := StrPMatchNoAsciiCaseA(P, Pointer(S), Len);
  13748. end;
  13749. {$ENDIF}
  13750. {$IFDEF CLR}
  13751. function StrEqual(const A, B: AnsiString; const CaseSensitive: Boolean): Boolean;
  13752. var L1, L2 : Integer;
  13753. begin
  13754. L1 := Length(A);
  13755. L2 := Length(B);
  13756. Result := L1 = L2;
  13757. if not Result or (L1 = 0) then
  13758. exit;
  13759. if CaseSensitive then
  13760. Result := StrPMatchA(A, B, L1)
  13761. else
  13762. Result := StrPMatchNoAsciiCaseA(A, B, L1);
  13763. end;
  13764. {$ELSE}
  13765. function StrEqualA(const A, B: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  13766. var L1, L2 : Integer;
  13767. begin
  13768. L1 := Length(A);
  13769. L2 := Length(B);
  13770. Result := L1 = L2;
  13771. if not Result or (L1 = 0) then
  13772. exit;
  13773. if AsciiCaseSensitive then
  13774. Result := StrPMatchA(Pointer(A), Pointer(B), L1)
  13775. else
  13776. Result := StrPMatchNoAsciiCaseA(Pointer(A), Pointer(B), L1);
  13777. end;
  13778. function StrEqualW(const A, B: WideString; const AsciiCaseSensitive: Boolean): Boolean;
  13779. var L1, L2 : Integer;
  13780. begin
  13781. L1 := Length(A);
  13782. L2 := Length(B);
  13783. Result := L1 = L2;
  13784. if not Result or (L1 = 0) then
  13785. exit;
  13786. if AsciiCaseSensitive then
  13787. Result := StrPMatchW(Pointer(A), Pointer(B), L1)
  13788. else
  13789. Result := StrPMatchNoAsciiCaseW(Pointer(A), Pointer(B), L1);
  13790. end;
  13791. function StrEqualAW(const A: WideString; const B: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  13792. var L1, L2 : Integer;
  13793. begin
  13794. L1 := Length(A);
  13795. L2 := Length(B);
  13796. Result := L1 = L2;
  13797. if not Result or (L1 = 0) then
  13798. exit;
  13799. if AsciiCaseSensitive then
  13800. Result := StrPMatchAW(Pointer(A), Pointer(B), L1, L1)
  13801. else
  13802. Result := StrPMatchNoAsciiCaseAW(Pointer(A), Pointer(B), L1);
  13803. end;
  13804. function StrEqualU(const A, B: UnicodeString; const AsciiCaseSensitive: Boolean): Boolean;
  13805. var L1, L2 : Integer;
  13806. begin
  13807. L1 := Length(A);
  13808. L2 := Length(B);
  13809. Result := L1 = L2;
  13810. if not Result or (L1 = 0) then
  13811. exit;
  13812. if AsciiCaseSensitive then
  13813. Result := StrPMatchW(Pointer(A), Pointer(B), L1)
  13814. else
  13815. Result := StrPMatchNoAsciiCaseW(Pointer(A), Pointer(B), L1);
  13816. end;
  13817. function StrEqualAU(const A: UnicodeString; const B: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  13818. var L1, L2 : Integer;
  13819. begin
  13820. L1 := Length(A);
  13821. L2 := Length(B);
  13822. Result := L1 = L2;
  13823. if not Result or (L1 = 0) then
  13824. exit;
  13825. if AsciiCaseSensitive then
  13826. Result := StrPMatchAW(Pointer(A), Pointer(B), L1, L1)
  13827. else
  13828. Result := StrPMatchNoAsciiCaseAW(Pointer(A), Pointer(B), L1);
  13829. end;
  13830. function StrEqual(const A, B: String; const AsciiCaseSensitive: Boolean): Boolean;
  13831. var L1, L2 : Integer;
  13832. begin
  13833. L1 := Length(A);
  13834. L2 := Length(B);
  13835. Result := L1 = L2;
  13836. if not Result or (L1 = 0) then
  13837. exit;
  13838. if AsciiCaseSensitive then
  13839. Result := StrPMatch(Pointer(A), Pointer(B), L1)
  13840. else
  13841. Result := StrPMatchNoAsciiCase(Pointer(A), Pointer(B), L1);
  13842. end;
  13843. {$ENDIF}
  13844. {$IFDEF CLR}
  13845. function StrEqualNoAsciiCaseA(const A, B: AnsiString): Boolean;
  13846. var L : Integer;
  13847. begin
  13848. L := Length(A);
  13849. Result := L = Length(B);
  13850. if not Result or (L = 0) then
  13851. exit;
  13852. Result := StrPMatchNoAsciiCaseA(A, B, L);
  13853. end;
  13854. {$ELSE}
  13855. function StrEqualNoAsciiCaseA(const A, B: AnsiString): Boolean;
  13856. var L, M : Integer;
  13857. begin
  13858. L := Length(A);
  13859. M := Length(B);
  13860. Result := L = M;
  13861. if not Result or (L = 0) then
  13862. exit;
  13863. Result := StrPMatchNoAsciiCaseA(Pointer(A), Pointer(B), L);
  13864. end;
  13865. function StrEqualNoAsciiCaseW(const A, B: WideString): Boolean;
  13866. var L, M : Integer;
  13867. begin
  13868. L := Length(A);
  13869. M := Length(B);
  13870. Result := L = M;
  13871. if not Result or (L = 0) then
  13872. exit;
  13873. Result := StrPMatchNoAsciiCaseW(Pointer(A), Pointer(B), L);
  13874. end;
  13875. function StrEqualNoAsciiCaseAW(const A: WideString; const B: AnsiString): Boolean;
  13876. var L, M : Integer;
  13877. begin
  13878. L := Length(A);
  13879. M := Length(B);
  13880. Result := L = M;
  13881. if not Result or (L = 0) then
  13882. exit;
  13883. Result := StrPMatchNoAsciiCaseAW(Pointer(A), Pointer(B), L);
  13884. end;
  13885. function StrEqualNoAsciiCaseU(const A, B: UnicodeString): Boolean;
  13886. var L, M : Integer;
  13887. begin
  13888. L := Length(A);
  13889. M := Length(B);
  13890. Result := L = M;
  13891. if not Result or (L = 0) then
  13892. exit;
  13893. Result := StrPMatchNoAsciiCaseW(Pointer(A), Pointer(B), L);
  13894. end;
  13895. function StrEqualNoAsciiCaseAU(const A: UnicodeString; const B: AnsiString): Boolean;
  13896. var L, M : Integer;
  13897. begin
  13898. L := Length(A);
  13899. M := Length(B);
  13900. Result := L = M;
  13901. if not Result or (L = 0) then
  13902. exit;
  13903. Result := StrPMatchNoAsciiCaseAW(Pointer(A), Pointer(B), L);
  13904. end;
  13905. function StrEqualNoAsciiCase(const A, B: String): Boolean;
  13906. var L, M : Integer;
  13907. begin
  13908. L := Length(A);
  13909. M := Length(B);
  13910. Result := L = M;
  13911. if not Result or (L = 0) then
  13912. exit;
  13913. Result := StrPMatchNoAsciiCase(Pointer(A), Pointer(B), L);
  13914. end;
  13915. function StrEqualNoUnicodeCaseW(const A, B: WideString): Boolean;
  13916. var L, M : Integer;
  13917. begin
  13918. L := Length(A);
  13919. M := Length(B);
  13920. Result := L = M;
  13921. if not Result or (L = 0) then
  13922. exit;
  13923. Result := StrPMatchNoUnicodeCaseW(Pointer(A), Pointer(B), L);
  13924. end;
  13925. function StrEqualNoUnicodeCaseU(const A, B: UnicodeString): Boolean;
  13926. var L, M : Integer;
  13927. begin
  13928. L := Length(A);
  13929. M := Length(B);
  13930. Result := L = M;
  13931. if not Result or (L = 0) then
  13932. exit;
  13933. Result := StrPMatchNoUnicodeCaseW(Pointer(A), Pointer(B), L);
  13934. end;
  13935. {$ENDIF}
  13936. { }
  13937. { Validation }
  13938. { }
  13939. function StrIsNumericA(const S: AnsiString): Boolean;
  13940. begin
  13941. Result := StrMatchCharA(S, csNumeric);
  13942. end;
  13943. function StrIsNumericW(const S: WideString): Boolean;
  13944. begin
  13945. Result := StrMatchCharW(S, csNumeric);
  13946. end;
  13947. function StrIsNumeric(const S: String): Boolean;
  13948. begin
  13949. Result := StrMatchChar(S, csNumeric);
  13950. end;
  13951. function StrIsHexA(const S: AnsiString): Boolean;
  13952. begin
  13953. Result := StrMatchCharA(S, csHexDigit);
  13954. end;
  13955. function StrIsHexW(const S: WideString): Boolean;
  13956. begin
  13957. Result := StrMatchCharW(S, csHexDigit);
  13958. end;
  13959. function StrIsHex(const S: String): Boolean;
  13960. begin
  13961. Result := StrMatchChar(S, csHexDigit);
  13962. end;
  13963. function StrIsAlphaA(const S: AnsiString): Boolean;
  13964. begin
  13965. Result := StrMatchCharA(S, csAlpha);
  13966. end;
  13967. function StrIsAlphaW(const S: WideString): Boolean;
  13968. begin
  13969. Result := StrMatchCharW(S, csAlpha);
  13970. end;
  13971. function StrIsAlpha(const S: String): Boolean;
  13972. begin
  13973. Result := StrMatchChar(S, csAlpha);
  13974. end;
  13975. function StrIsAlphaNumericA(const S: AnsiString): Boolean;
  13976. begin
  13977. Result := StrMatchCharA(S, csAlphaNumeric);
  13978. end;
  13979. function StrIsAlphaNumericW(const S: WideString): Boolean;
  13980. begin
  13981. Result := StrMatchCharW(S, csAlphaNumeric);
  13982. end;
  13983. function StrIsAlphaNumeric(const S: String): Boolean;
  13984. begin
  13985. Result := StrMatchChar(S, csAlphaNumeric);
  13986. end;
  13987. {$IFDEF CLR}
  13988. function StrIsInteger(const S: AnsiString): Boolean;
  13989. var L : Integer;
  13990. P : Integer;
  13991. begin
  13992. L := Length(S);
  13993. Result := L > 0;
  13994. if not Result then
  13995. exit;
  13996. P := 1;
  13997. if S[P] in csSign then
  13998. begin
  13999. Inc(P);
  14000. Dec(L);
  14001. end;
  14002. Result := (L > 0) and (StrMatchLen(S, csNumeric, P) = L);
  14003. end;
  14004. {$ELSE}
  14005. function StrIsIntegerA(const S: AnsiString): Boolean;
  14006. var L: Integer;
  14007. P: PAnsiChar;
  14008. begin
  14009. L := Length(S);
  14010. Result := L > 0;
  14011. if not Result then
  14012. exit;
  14013. P := Pointer(S);
  14014. if P^ in csSign then
  14015. begin
  14016. Inc(P);
  14017. Dec(L);
  14018. end;
  14019. Result := (L > 0) and (StrPMatchLenA(P, L, csNumeric) = L);
  14020. end;
  14021. function StrIsIntegerW(const S: WideString): Boolean;
  14022. var L: Integer;
  14023. P: PWideChar;
  14024. begin
  14025. L := Length(S);
  14026. Result := L > 0;
  14027. if not Result then
  14028. exit;
  14029. P := Pointer(S);
  14030. case P^ of
  14031. '+', '-' :
  14032. begin
  14033. Inc(P);
  14034. Dec(L);
  14035. end;
  14036. end;
  14037. Result := (L > 0) and (StrPMatchLenW(P, L, csNumeric) = L);
  14038. end;
  14039. function StrIsInteger(const S: String): Boolean;
  14040. var L: Integer;
  14041. P: PChar;
  14042. begin
  14043. L := Length(S);
  14044. Result := L > 0;
  14045. if not Result then
  14046. exit;
  14047. P := Pointer(S);
  14048. case P^ of
  14049. '+', '-' :
  14050. begin
  14051. Inc(P);
  14052. Dec(L);
  14053. end;
  14054. end;
  14055. Result := (L > 0) and (StrPMatchLen(P, L, csNumeric) = L);
  14056. end;
  14057. {$ENDIF}
  14058. { }
  14059. { Pos }
  14060. { }
  14061. {$IFNDEF ManagedCode}
  14062. function StrPPosChar(const F: AnsiChar; const S: PAnsiChar; const Len: Integer): Integer;
  14063. var I : Integer;
  14064. P : PAnsiChar;
  14065. begin
  14066. if Len <= 0 then
  14067. begin
  14068. Result := -1;
  14069. exit;
  14070. end;
  14071. P := S;
  14072. for I := 0 to Len - 1 do
  14073. if P^ = F then
  14074. begin
  14075. Result := I;
  14076. exit;
  14077. end
  14078. else
  14079. Inc(P);
  14080. Result := -1;
  14081. end;
  14082. function StrPPosChar(const F: CharSet; const S: PAnsiChar; const Len: Integer): Integer;
  14083. var I : Integer;
  14084. P : PAnsiChar;
  14085. begin
  14086. if Len <= 0 then
  14087. begin
  14088. Result := -1;
  14089. exit;
  14090. end;
  14091. P := S;
  14092. for I := 0 to Len - 1 do
  14093. if P^ in F then
  14094. begin
  14095. Result := I;
  14096. exit;
  14097. end
  14098. else
  14099. Inc(P);
  14100. Result := -1;
  14101. end;
  14102. function StrPPos(const F, S: PAnsiChar; const LenF, LenS: Integer): Integer;
  14103. var I : Integer;
  14104. P : PAnsiChar;
  14105. begin
  14106. if (LenF <= 0) or (LenS <= 0) or (LenF > LenS) then
  14107. begin
  14108. Result := -1;
  14109. exit;
  14110. end;
  14111. P := S;
  14112. for I := 0 to LenS - LenF do
  14113. if StrPMatchA(P, F, LenF) then
  14114. begin
  14115. Result := I;
  14116. exit;
  14117. end
  14118. else
  14119. Inc(P);
  14120. Result := -1;
  14121. end;
  14122. function StrPPosStr(const F: String; const S: PAnsiChar; const Len: Integer): Integer;
  14123. begin
  14124. Result := StrPPos(Pointer(F), S, Length(F), Len);
  14125. end;
  14126. function StrZPosCharA(const F: AnsiChar; const S: PAnsiChar): Integer;
  14127. var C : AnsiChar;
  14128. P : PAnsiChar;
  14129. begin
  14130. if not Assigned(S) or (F = #0) then
  14131. Result := -1
  14132. else
  14133. begin
  14134. Result := 0;
  14135. P := S;
  14136. C := P^;
  14137. while C <> F do
  14138. if C = #0 then
  14139. begin
  14140. Result := -1;
  14141. exit;
  14142. end
  14143. else
  14144. begin
  14145. Inc(Result);
  14146. Inc(P);
  14147. C := P^;
  14148. end;
  14149. end;
  14150. end;
  14151. function StrZPosCharW(const F: WideChar; const S: PWideChar): Integer;
  14152. var C : WideChar;
  14153. P : PWideChar;
  14154. begin
  14155. if not Assigned(S) or (F = #0) then
  14156. Result := -1
  14157. else
  14158. begin
  14159. Result := 0;
  14160. P := S;
  14161. C := P^;
  14162. while C <> F do
  14163. if C = #0 then
  14164. begin
  14165. Result := -1;
  14166. exit;
  14167. end
  14168. else
  14169. begin
  14170. Inc(Result);
  14171. Inc(P);
  14172. C := P^;
  14173. end;
  14174. end;
  14175. end;
  14176. function StrZPosChar(const F: Char; const S: PChar): Integer;
  14177. var C : Char;
  14178. P : PChar;
  14179. begin
  14180. if not Assigned(S) or (F = #0) then
  14181. Result := -1
  14182. else
  14183. begin
  14184. Result := 0;
  14185. P := S;
  14186. C := P^;
  14187. while C <> F do
  14188. if C = #0 then
  14189. begin
  14190. Result := -1;
  14191. exit;
  14192. end
  14193. else
  14194. begin
  14195. Inc(Result);
  14196. Inc(P);
  14197. C := P^;
  14198. end;
  14199. end;
  14200. end;
  14201. function StrZPosCharSetA(const F: CharSet; const S: PAnsiChar): Integer;
  14202. var C : AnsiChar;
  14203. P : PAnsiChar;
  14204. begin
  14205. if not Assigned(S) or (F = []) then
  14206. Result := -1
  14207. else
  14208. begin
  14209. Result := 0;
  14210. P := S;
  14211. repeat
  14212. C := P^;
  14213. if C = #0 then
  14214. begin
  14215. Result := -1;
  14216. exit;
  14217. end;
  14218. if C in F then
  14219. break;
  14220. Inc(Result);
  14221. Inc(P);
  14222. until False;
  14223. end;
  14224. end;
  14225. function StrZPosCharSetW(const F: CharSet; const S: PWideChar): Integer;
  14226. var C : WideChar;
  14227. P : PWideChar;
  14228. begin
  14229. if not Assigned(S) or (F = []) then
  14230. Result := -1
  14231. else
  14232. begin
  14233. Result := 0;
  14234. P := S;
  14235. repeat
  14236. C := P^;
  14237. if C = #0 then
  14238. begin
  14239. Result := -1;
  14240. exit;
  14241. end;
  14242. if Ord(C) <= $FF then
  14243. if AnsiChar(Ord(C)) in F then
  14244. break;
  14245. Inc(Result);
  14246. Inc(P);
  14247. until False;
  14248. end;
  14249. end;
  14250. function StrZPosCharSetW(const F: TWideCharMatchFunction; const S: PWideChar): Integer;
  14251. var C : WideChar;
  14252. P : PWideChar;
  14253. begin
  14254. if not Assigned(S) or not Assigned(F) then
  14255. Result := -1
  14256. else
  14257. begin
  14258. Result := 0;
  14259. P := S;
  14260. repeat
  14261. C := P^;
  14262. if C = #0 then
  14263. begin
  14264. Result := -1;
  14265. exit;
  14266. end;
  14267. if F(C) then
  14268. break;
  14269. Inc(Result);
  14270. Inc(P);
  14271. until False;
  14272. end;
  14273. end;
  14274. function StrZPosCharSet(const F: CharSet; const S: PChar): Integer;
  14275. var C : Char;
  14276. P : PChar;
  14277. begin
  14278. if not Assigned(S) or (F = []) then
  14279. Result := -1
  14280. else
  14281. begin
  14282. Result := 0;
  14283. P := S;
  14284. repeat
  14285. C := P^;
  14286. if C = #0 then
  14287. begin
  14288. Result := -1;
  14289. exit;
  14290. end;
  14291. {$IFDEF StringIsUnicode}
  14292. if Ord(C) <= $FF then
  14293. if AnsiChar(Ord(C)) in F then
  14294. break;
  14295. {$ELSE}
  14296. if C in F then
  14297. break;
  14298. {$ENDIF}
  14299. Inc(Result);
  14300. Inc(P);
  14301. until False;
  14302. end;
  14303. end;
  14304. function StrZPosNotCharSetA(const F: CharSet; const S: PAnsiChar): Integer;
  14305. var C : AnsiChar;
  14306. P : PAnsiChar;
  14307. begin
  14308. if not Assigned(S) then
  14309. Result := -1
  14310. else
  14311. begin
  14312. Result := 0;
  14313. P := S;
  14314. repeat
  14315. C := P^;
  14316. if C = #0 then
  14317. begin
  14318. Result := -1;
  14319. exit;
  14320. end;
  14321. if not (C in F) then
  14322. break;
  14323. Inc(Result);
  14324. Inc(P);
  14325. until False;
  14326. end;
  14327. end;
  14328. function StrZPosNotCharSetW(const F: CharSet; const S: PWideChar): Integer;
  14329. var C : WideChar;
  14330. P : PWideChar;
  14331. begin
  14332. if not Assigned(S) then
  14333. Result := -1
  14334. else
  14335. begin
  14336. Result := 0;
  14337. P := S;
  14338. repeat
  14339. C := P^;
  14340. if C = #0 then
  14341. begin
  14342. Result := -1;
  14343. exit;
  14344. end;
  14345. if Ord(C) >= $100 then
  14346. break;
  14347. if not (AnsiChar(Ord(C)) in F) then
  14348. break;
  14349. Inc(Result);
  14350. Inc(P);
  14351. until False;
  14352. end;
  14353. end;
  14354. function StrZPosNotCharSetW(const F: TWideCharMatchFunction; const S: PWideChar): Integer;
  14355. var C : WideChar;
  14356. P : PWideChar;
  14357. begin
  14358. if not Assigned(S) then
  14359. Result := -1
  14360. else
  14361. begin
  14362. Result := 0;
  14363. P := S;
  14364. repeat
  14365. C := P^;
  14366. if C = #0 then
  14367. begin
  14368. Result := -1;
  14369. exit;
  14370. end;
  14371. if not F(C) then
  14372. break;
  14373. Inc(Result);
  14374. Inc(P);
  14375. until False;
  14376. end;
  14377. end;
  14378. function StrZPosNotCharSet(const F: CharSet; const S: PChar): Integer;
  14379. var C : Char;
  14380. P : PChar;
  14381. begin
  14382. if not Assigned(S) then
  14383. Result := -1
  14384. else
  14385. begin
  14386. Result := 0;
  14387. P := S;
  14388. repeat
  14389. C := P^;
  14390. if C = #0 then
  14391. begin
  14392. Result := -1;
  14393. exit;
  14394. end;
  14395. {$IFDEF StringIsUnicode}
  14396. if Ord(C) >= $100 then
  14397. break;
  14398. if not (AnsiChar(Ord(C)) in F) then
  14399. break;
  14400. {$ELSE}
  14401. if not (C in F) then
  14402. break;
  14403. {$ENDIF}
  14404. Inc(Result);
  14405. Inc(P);
  14406. until False;
  14407. end;
  14408. end;
  14409. function StrZPosA(const F: AnsiString; const S: PAnsiChar): Integer;
  14410. var C : AnsiChar;
  14411. P : PAnsiChar;
  14412. begin
  14413. if not Assigned(S) or (F = '') then
  14414. Result := -1
  14415. else
  14416. begin
  14417. Result := 0;
  14418. P := S;
  14419. repeat
  14420. C := P^;
  14421. if C = #0 then
  14422. begin
  14423. Result := -1;
  14424. exit;
  14425. end;
  14426. if StrZMatchStrA(P, F) then
  14427. break;
  14428. Inc(Result);
  14429. Inc(P);
  14430. until False;
  14431. end;
  14432. end;
  14433. function StrZPosW(const F: WideString; const S: PWideChar): Integer;
  14434. var C : WideChar;
  14435. P : PWideChar;
  14436. begin
  14437. if not Assigned(S) or (F = '') then
  14438. Result := -1
  14439. else
  14440. begin
  14441. Result := 0;
  14442. P := S;
  14443. repeat
  14444. C := P^;
  14445. if C = #0 then
  14446. begin
  14447. Result := -1;
  14448. exit;
  14449. end;
  14450. if StrZMatchStrW(P, F) then
  14451. break;
  14452. Inc(Result);
  14453. Inc(P);
  14454. until False;
  14455. end;
  14456. end;
  14457. function StrZPosAW(const F: AnsiString; const S: PWideChar): Integer;
  14458. var C : WideChar;
  14459. P : PWideChar;
  14460. begin
  14461. if not Assigned(S) or (F = '') then
  14462. Result := -1
  14463. else
  14464. begin
  14465. Result := 0;
  14466. P := S;
  14467. repeat
  14468. C := P^;
  14469. if C = #0 then
  14470. begin
  14471. Result := -1;
  14472. exit;
  14473. end;
  14474. if StrZMatchStrAW(P, F) then
  14475. break;
  14476. Inc(Result);
  14477. Inc(P);
  14478. until False;
  14479. end;
  14480. end;
  14481. {$ENDIF}
  14482. {$IFDEF CLR}
  14483. function PosCharA(const F: AnsiChar; const S: AnsiString; const Index: Integer): Integer;
  14484. var L, I : Integer;
  14485. begin
  14486. L := Length(S);
  14487. if (L = 0) or (Index > L) then
  14488. begin
  14489. Result := 0;
  14490. exit;
  14491. end;
  14492. if Index < 1 then
  14493. I := 1
  14494. else
  14495. I := Index;
  14496. while I <= L do
  14497. if S[I] = F then
  14498. begin
  14499. Result := I;
  14500. exit;
  14501. end
  14502. else
  14503. Inc(I);
  14504. Result := 0;
  14505. end;
  14506. {$ELSE}
  14507. function PosCharA(const F: AnsiChar; const S: AnsiString; const Index: Integer): Integer;
  14508. var P : PAnsiChar;
  14509. L, I : Integer;
  14510. begin
  14511. L := Length(S);
  14512. if (L = 0) or (Index > L) then
  14513. begin
  14514. Result := 0;
  14515. exit;
  14516. end;
  14517. if Index < 1 then
  14518. I := 1
  14519. else
  14520. I := Index;
  14521. P := Pointer(S);
  14522. Inc(P, I - 1);
  14523. while I <= L do
  14524. if P^ = F then
  14525. begin
  14526. Result := I;
  14527. exit;
  14528. end else
  14529. begin
  14530. Inc(P);
  14531. Inc(I);
  14532. end;
  14533. Result := 0;
  14534. end;
  14535. {$ENDIF}
  14536. function PosCharW(const F: WideChar; const S: WideString; const Index: Integer): Integer;
  14537. var L, I : Integer;
  14538. begin
  14539. L := Length(S);
  14540. if (L = 0) or (Index > L) then
  14541. begin
  14542. Result := 0;
  14543. exit;
  14544. end;
  14545. if Index < 1 then
  14546. I := 1
  14547. else
  14548. I := Index;
  14549. while I <= L do
  14550. if S[I] = F then
  14551. begin
  14552. Result := I;
  14553. exit;
  14554. end
  14555. else
  14556. Inc(I);
  14557. Result := 0;
  14558. end;
  14559. function PosCharU(const F: WideChar; const S: UnicodeString; const Index: Integer): Integer;
  14560. var L, I : Integer;
  14561. begin
  14562. L := Length(S);
  14563. if (L = 0) or (Index > L) then
  14564. begin
  14565. Result := 0;
  14566. exit;
  14567. end;
  14568. if Index < 1 then
  14569. I := 1
  14570. else
  14571. I := Index;
  14572. while I <= L do
  14573. if S[I] = F then
  14574. begin
  14575. Result := I;
  14576. exit;
  14577. end
  14578. else
  14579. Inc(I);
  14580. Result := 0;
  14581. end;
  14582. function PosChar(const F: Char; const S: String; const Index: Integer): Integer;
  14583. var L, I : Integer;
  14584. begin
  14585. L := Length(S);
  14586. if (L = 0) or (Index > L) then
  14587. begin
  14588. Result := 0;
  14589. exit;
  14590. end;
  14591. if Index < 1 then
  14592. I := 1
  14593. else
  14594. I := Index;
  14595. while I <= L do
  14596. if S[I] = F then
  14597. begin
  14598. Result := I;
  14599. exit;
  14600. end
  14601. else
  14602. Inc(I);
  14603. Result := 0;
  14604. end;
  14605. {$IFDEF CLR}
  14606. function PosCharSetA(const F: CharSet; const S: AnsiString; const Index: Integer): Integer;
  14607. var L, I : Integer;
  14608. begin
  14609. L := Length(S);
  14610. if (L = 0) or (Index > L) then
  14611. begin
  14612. Result := 0;
  14613. exit;
  14614. end;
  14615. if Index < 1 then
  14616. I := 1
  14617. else
  14618. I := Index;
  14619. while I <= L do
  14620. if S[I] in F then
  14621. begin
  14622. Result := I;
  14623. exit;
  14624. end
  14625. else
  14626. Inc(I);
  14627. Result := 0;
  14628. end;
  14629. {$ELSE}
  14630. function PosCharSetA(const F: CharSet; const S: AnsiString; const Index: Integer): Integer;
  14631. var P : PAnsiChar;
  14632. L, I : Integer;
  14633. begin
  14634. L := Length(S);
  14635. if (L = 0) or (Index > L) then
  14636. begin
  14637. Result := 0;
  14638. exit;
  14639. end;
  14640. if Index < 1 then
  14641. I := 1
  14642. else
  14643. I := Index;
  14644. P := Pointer(S);
  14645. Inc(P, I - 1);
  14646. while I <= L do
  14647. if P^ in F then
  14648. begin
  14649. Result := I;
  14650. exit;
  14651. end else
  14652. begin
  14653. Inc(P);
  14654. Inc(I);
  14655. end;
  14656. Result := 0;
  14657. end;
  14658. function PosCharSetW(const F: CharSet; const S: WideString;
  14659. const Index: Integer): Integer;
  14660. var P : PWideChar;
  14661. C : WideChar;
  14662. L, I : Integer;
  14663. begin
  14664. L := Length(S);
  14665. if (L = 0) or (Index > L) then
  14666. begin
  14667. Result := 0;
  14668. exit;
  14669. end;
  14670. if Index < 1 then
  14671. I := 1
  14672. else
  14673. I := Index;
  14674. P := Pointer(S);
  14675. Inc(P, I - 1);
  14676. while I <= L do
  14677. begin
  14678. C := P^;
  14679. if Ord(C) <= $FF then
  14680. if AnsiChar(Ord(C)) in F then
  14681. begin
  14682. Result := I;
  14683. exit;
  14684. end else
  14685. begin
  14686. Inc(P);
  14687. Inc(I);
  14688. end;
  14689. end;
  14690. Result := 0;
  14691. end;
  14692. function PosCharSetW(const F: TWideCharMatchFunction; const S: WideString;
  14693. const Index: Integer): Integer;
  14694. var P : PWideChar;
  14695. C : WideChar;
  14696. L, I : Integer;
  14697. begin
  14698. L := Length(S);
  14699. if (L = 0) or (Index > L) then
  14700. begin
  14701. Result := 0;
  14702. exit;
  14703. end;
  14704. if Index < 1 then
  14705. I := 1
  14706. else
  14707. I := Index;
  14708. P := Pointer(S);
  14709. Inc(P, I - 1);
  14710. while I <= L do
  14711. begin
  14712. C := P^;
  14713. if F(C) then
  14714. begin
  14715. Result := I;
  14716. exit;
  14717. end else
  14718. begin
  14719. Inc(P);
  14720. Inc(I);
  14721. end;
  14722. end;
  14723. Result := 0;
  14724. end;
  14725. function PosCharSetU(const F: CharSet; const S: UnicodeString;
  14726. const Index: Integer): Integer;
  14727. var P : PWideChar;
  14728. C : WideChar;
  14729. L, I : Integer;
  14730. begin
  14731. L := Length(S);
  14732. if (L = 0) or (Index > L) then
  14733. begin
  14734. Result := 0;
  14735. exit;
  14736. end;
  14737. if Index < 1 then
  14738. I := 1
  14739. else
  14740. I := Index;
  14741. P := Pointer(S);
  14742. Inc(P, I - 1);
  14743. while I <= L do
  14744. begin
  14745. C := P^;
  14746. if Ord(C) <= $FF then
  14747. if AnsiChar(Ord(C)) in F then
  14748. begin
  14749. Result := I;
  14750. exit;
  14751. end else
  14752. begin
  14753. Inc(P);
  14754. Inc(I);
  14755. end;
  14756. end;
  14757. Result := 0;
  14758. end;
  14759. function PosCharSetU(const F: TWideCharMatchFunction; const S: UnicodeString;
  14760. const Index: Integer): Integer;
  14761. var P : PWideChar;
  14762. C : WideChar;
  14763. L, I : Integer;
  14764. begin
  14765. L := Length(S);
  14766. if (L = 0) or (Index > L) then
  14767. begin
  14768. Result := 0;
  14769. exit;
  14770. end;
  14771. if Index < 1 then
  14772. I := 1
  14773. else
  14774. I := Index;
  14775. P := Pointer(S);
  14776. Inc(P, I - 1);
  14777. while I <= L do
  14778. begin
  14779. C := P^;
  14780. if F(C) then
  14781. begin
  14782. Result := I;
  14783. exit;
  14784. end else
  14785. begin
  14786. Inc(P);
  14787. Inc(I);
  14788. end;
  14789. end;
  14790. Result := 0;
  14791. end;
  14792. function PosCharSet(const F: CharSet; const S: String;
  14793. const Index: Integer): Integer;
  14794. var P : PChar;
  14795. C : Char;
  14796. L, I : Integer;
  14797. begin
  14798. L := Length(S);
  14799. if (L = 0) or (Index > L) then
  14800. begin
  14801. Result := 0;
  14802. exit;
  14803. end;
  14804. if Index < 1 then
  14805. I := 1
  14806. else
  14807. I := Index;
  14808. P := Pointer(S);
  14809. Inc(P, I - 1);
  14810. while I <= L do
  14811. begin
  14812. C := P^;
  14813. {$IFDEF StringIsUnicode}
  14814. if Ord(C) <= $FF then
  14815. {$ENDIF}
  14816. if AnsiChar(Ord(C)) in F then
  14817. begin
  14818. Result := I;
  14819. exit;
  14820. end else
  14821. begin
  14822. Inc(P);
  14823. Inc(I);
  14824. end;
  14825. end;
  14826. Result := 0;
  14827. end;
  14828. {$ENDIF}
  14829. {$IFDEF CLR}
  14830. function PosNotCharA(const F: AnsiChar; const S: AnsiString;
  14831. const Index: Integer): Integer;
  14832. var L, I : Integer;
  14833. begin
  14834. L := Length(S);
  14835. if (L = 0) or (Index > L) then
  14836. begin
  14837. Result := 0;
  14838. exit;
  14839. end;
  14840. if Index < 1 then
  14841. I := 1
  14842. else
  14843. I := Index;
  14844. while I <= L do
  14845. if S[I] <> F then
  14846. begin
  14847. Result := I;
  14848. exit;
  14849. end
  14850. else
  14851. Inc(I);
  14852. Result := 0;
  14853. end;
  14854. {$ELSE}
  14855. function PosNotCharA(const F: AnsiChar; const S: AnsiString;
  14856. const Index: Integer): Integer;
  14857. var P : PAnsiChar;
  14858. L, I : Integer;
  14859. begin
  14860. L := Length(S);
  14861. if (L = 0) or (Index > L) then
  14862. begin
  14863. Result := 0;
  14864. exit;
  14865. end;
  14866. if Index < 1 then
  14867. I := 1
  14868. else
  14869. I := Index;
  14870. P := Pointer(S);
  14871. Inc(P, I - 1);
  14872. while I <= L do
  14873. if P^ <> F then
  14874. begin
  14875. Result := I;
  14876. exit;
  14877. end else
  14878. begin
  14879. Inc(P);
  14880. Inc(I);
  14881. end;
  14882. Result := 0;
  14883. end;
  14884. {$ENDIF}
  14885. function PosNotCharW(const F: WideChar; const S: WideString; const Index: Integer): Integer;
  14886. var L, I : Integer;
  14887. begin
  14888. L := Length(S);
  14889. if (L = 0) or (Index > L) then
  14890. begin
  14891. Result := 0;
  14892. exit;
  14893. end;
  14894. if Index < 1 then
  14895. I := 1
  14896. else
  14897. I := Index;
  14898. while I <= L do
  14899. if S[I] <> F then
  14900. begin
  14901. Result := I;
  14902. exit;
  14903. end
  14904. else
  14905. Inc(I);
  14906. Result := 0;
  14907. end;
  14908. function PosNotCharU(const F: WideChar; const S: UnicodeString; const Index: Integer): Integer;
  14909. var L, I : Integer;
  14910. begin
  14911. L := Length(S);
  14912. if (L = 0) or (Index > L) then
  14913. begin
  14914. Result := 0;
  14915. exit;
  14916. end;
  14917. if Index < 1 then
  14918. I := 1
  14919. else
  14920. I := Index;
  14921. while I <= L do
  14922. if S[I] <> F then
  14923. begin
  14924. Result := I;
  14925. exit;
  14926. end
  14927. else
  14928. Inc(I);
  14929. Result := 0;
  14930. end;
  14931. function PosNotChar(const F: Char; const S: String; const Index: Integer): Integer;
  14932. var L, I : Integer;
  14933. begin
  14934. L := Length(S);
  14935. if (L = 0) or (Index > L) then
  14936. begin
  14937. Result := 0;
  14938. exit;
  14939. end;
  14940. if Index < 1 then
  14941. I := 1
  14942. else
  14943. I := Index;
  14944. while I <= L do
  14945. if S[I] <> F then
  14946. begin
  14947. Result := I;
  14948. exit;
  14949. end
  14950. else
  14951. Inc(I);
  14952. Result := 0;
  14953. end;
  14954. {$IFDEF CLR}
  14955. function PosNotCharSetA(const F: CharSet; const S: AnsiString;
  14956. const Index: Integer): Integer;
  14957. var L, I : Integer;
  14958. begin
  14959. L := Length(S);
  14960. if (L = 0) or (Index > L) then
  14961. begin
  14962. Result := 0;
  14963. exit;
  14964. end;
  14965. if Index < 1 then
  14966. I := 1
  14967. else
  14968. I := Index;
  14969. while I <= L do
  14970. if not (S[I] in F) then
  14971. begin
  14972. Result := I;
  14973. exit;
  14974. end
  14975. else
  14976. Inc(I);
  14977. Result := 0;
  14978. end;
  14979. {$ELSE}
  14980. function PosNotCharSetA(const F: CharSet; const S: AnsiString;
  14981. const Index: Integer): Integer;
  14982. var P : PAnsiChar;
  14983. L, I : Integer;
  14984. begin
  14985. L := Length(S);
  14986. if (L = 0) or (Index > L) then
  14987. begin
  14988. Result := 0;
  14989. exit;
  14990. end;
  14991. if Index < 1 then
  14992. I := 1
  14993. else
  14994. I := Index;
  14995. P := Pointer(S);
  14996. Inc(P, I - 1);
  14997. while I <= L do
  14998. if not (P^ in F) then
  14999. begin
  15000. Result := I;
  15001. exit;
  15002. end else
  15003. begin
  15004. Inc(P);
  15005. Inc(I);
  15006. end;
  15007. Result := 0;
  15008. end;
  15009. function PosNotCharSetW(const F: CharSet; const S: WideString;
  15010. const Index: Integer): Integer;
  15011. var P : PWideChar;
  15012. C : WideChar;
  15013. L, I : Integer;
  15014. R : Boolean;
  15015. begin
  15016. L := Length(S);
  15017. if (L = 0) or (Index > L) then
  15018. begin
  15019. Result := 0;
  15020. exit;
  15021. end;
  15022. if Index < 1 then
  15023. I := 1
  15024. else
  15025. I := Index;
  15026. P := Pointer(S);
  15027. Inc(P, I - 1);
  15028. while I <= L do
  15029. begin
  15030. C := P^;
  15031. R := Ord(C) > $FF;
  15032. if not R then
  15033. R := not (AnsiChar(Ord(C)) in F);
  15034. if R then
  15035. begin
  15036. Result := I;
  15037. exit;
  15038. end else
  15039. begin
  15040. Inc(P);
  15041. Inc(I);
  15042. end;
  15043. end;
  15044. Result := 0;
  15045. end;
  15046. function PosNotCharSetW(const F: TWideCharMatchFunction; const S: WideString;
  15047. const Index: Integer): Integer;
  15048. var P : PWideChar;
  15049. C : WideChar;
  15050. L, I : Integer;
  15051. R : Boolean;
  15052. begin
  15053. L := Length(S);
  15054. if (L = 0) or (Index > L) then
  15055. begin
  15056. Result := 0;
  15057. exit;
  15058. end;
  15059. if Index < 1 then
  15060. I := 1
  15061. else
  15062. I := Index;
  15063. P := Pointer(S);
  15064. Inc(P, I - 1);
  15065. while I <= L do
  15066. begin
  15067. C := P^;
  15068. R := not F(C);
  15069. if R then
  15070. begin
  15071. Result := I;
  15072. exit;
  15073. end else
  15074. begin
  15075. Inc(P);
  15076. Inc(I);
  15077. end;
  15078. end;
  15079. Result := 0;
  15080. end;
  15081. function PosNotCharSetU(const F: CharSet; const S: UnicodeString;
  15082. const Index: Integer): Integer;
  15083. var P : PWideChar;
  15084. C : WideChar;
  15085. L, I : Integer;
  15086. R : Boolean;
  15087. begin
  15088. L := Length(S);
  15089. if (L = 0) or (Index > L) then
  15090. begin
  15091. Result := 0;
  15092. exit;
  15093. end;
  15094. if Index < 1 then
  15095. I := 1
  15096. else
  15097. I := Index;
  15098. P := Pointer(S);
  15099. Inc(P, I - 1);
  15100. while I <= L do
  15101. begin
  15102. C := P^;
  15103. R := Ord(C) > $FF;
  15104. if not R then
  15105. R := not (AnsiChar(Ord(C)) in F);
  15106. if R then
  15107. begin
  15108. Result := I;
  15109. exit;
  15110. end else
  15111. begin
  15112. Inc(P);
  15113. Inc(I);
  15114. end;
  15115. end;
  15116. Result := 0;
  15117. end;
  15118. function PosNotCharSetU(const F: TWideCharMatchFunction; const S: UnicodeString;
  15119. const Index: Integer): Integer;
  15120. var P : PWideChar;
  15121. C : WideChar;
  15122. L, I : Integer;
  15123. R : Boolean;
  15124. begin
  15125. L := Length(S);
  15126. if (L = 0) or (Index > L) then
  15127. begin
  15128. Result := 0;
  15129. exit;
  15130. end;
  15131. if Index < 1 then
  15132. I := 1
  15133. else
  15134. I := Index;
  15135. P := Pointer(S);
  15136. Inc(P, I - 1);
  15137. while I <= L do
  15138. begin
  15139. C := P^;
  15140. R := not F(C);
  15141. if R then
  15142. begin
  15143. Result := I;
  15144. exit;
  15145. end else
  15146. begin
  15147. Inc(P);
  15148. Inc(I);
  15149. end;
  15150. end;
  15151. Result := 0;
  15152. end;
  15153. function PosNotCharSet(const F: CharSet; const S: String;
  15154. const Index: Integer): Integer;
  15155. var P : PChar;
  15156. C : Char;
  15157. L, I : Integer;
  15158. R : Boolean;
  15159. begin
  15160. L := Length(S);
  15161. if (L = 0) or (Index > L) then
  15162. begin
  15163. Result := 0;
  15164. exit;
  15165. end;
  15166. if Index < 1 then
  15167. I := 1
  15168. else
  15169. I := Index;
  15170. P := Pointer(S);
  15171. Inc(P, I - 1);
  15172. while I <= L do
  15173. begin
  15174. C := P^;
  15175. {$IFDEF StringIsUnicode}
  15176. R := Ord(C) > $FF;
  15177. if not R then
  15178. {$ENDIF}
  15179. R := not (AnsiChar(Ord(C)) in F);
  15180. if R then
  15181. begin
  15182. Result := I;
  15183. exit;
  15184. end else
  15185. begin
  15186. Inc(P);
  15187. Inc(I);
  15188. end;
  15189. end;
  15190. Result := 0;
  15191. end;
  15192. {$ENDIF}
  15193. {$IFDEF CLR}
  15194. function PosCharRev(const F: AnsiChar; const S: AnsiString;
  15195. const Index: Integer): Integer;
  15196. var L, I, J : Integer;
  15197. begin
  15198. L := Length(S);
  15199. if (L = 0) or (Index > L) then
  15200. begin
  15201. Result := 0;
  15202. exit;
  15203. end;
  15204. if Index < 1 then
  15205. I := 1
  15206. else
  15207. I := Index;
  15208. J := L;
  15209. while J >= I do
  15210. if S[J] = F then
  15211. begin
  15212. Result := J;
  15213. exit;
  15214. end
  15215. else
  15216. Dec(J);
  15217. Result := 0;
  15218. end;
  15219. {$ELSE}
  15220. function PosCharRevA(const F: AnsiChar; const S: AnsiString;
  15221. const Index: Integer): Integer;
  15222. var P : PAnsiChar;
  15223. L, I, J : Integer;
  15224. begin
  15225. L := Length(S);
  15226. if (L = 0) or (Index > L) then
  15227. begin
  15228. Result := 0;
  15229. exit;
  15230. end;
  15231. if Index < 1 then
  15232. I := 1
  15233. else
  15234. I := Index;
  15235. P := Pointer(S);
  15236. J := L;
  15237. Inc(P, J - 1);
  15238. while J >= I do
  15239. if P^ = F then
  15240. begin
  15241. Result := J;
  15242. exit;
  15243. end else
  15244. begin
  15245. Dec(P);
  15246. Dec(J);
  15247. end;
  15248. Result := 0;
  15249. end;
  15250. {$ENDIF}
  15251. function PosCharRevW(const F: WideChar; const S: WideString; const Index: Integer): Integer;
  15252. var L, I, J : Integer;
  15253. begin
  15254. L := Length(S);
  15255. if (L = 0) or (Index > L) then
  15256. begin
  15257. Result := 0;
  15258. exit;
  15259. end;
  15260. if Index < 1 then
  15261. I := 1
  15262. else
  15263. I := Index;
  15264. J := L;
  15265. while J >= I do
  15266. if S[J] = F then
  15267. begin
  15268. Result := J;
  15269. exit;
  15270. end
  15271. else
  15272. Dec(J);
  15273. Result := 0;
  15274. end;
  15275. function PosCharRevU(const F: WideChar; const S: UnicodeString; const Index: Integer): Integer;
  15276. var L, I, J : Integer;
  15277. begin
  15278. L := Length(S);
  15279. if (L = 0) or (Index > L) then
  15280. begin
  15281. Result := 0;
  15282. exit;
  15283. end;
  15284. if Index < 1 then
  15285. I := 1
  15286. else
  15287. I := Index;
  15288. J := L;
  15289. while J >= I do
  15290. if S[J] = F then
  15291. begin
  15292. Result := J;
  15293. exit;
  15294. end
  15295. else
  15296. Dec(J);
  15297. Result := 0;
  15298. end;
  15299. function PosCharRev(const F: Char; const S: String; const Index: Integer): Integer;
  15300. var L, I, J : Integer;
  15301. begin
  15302. L := Length(S);
  15303. if (L = 0) or (Index > L) then
  15304. begin
  15305. Result := 0;
  15306. exit;
  15307. end;
  15308. if Index < 1 then
  15309. I := 1
  15310. else
  15311. I := Index;
  15312. J := L;
  15313. while J >= I do
  15314. if S[J] = F then
  15315. begin
  15316. Result := J;
  15317. exit;
  15318. end
  15319. else
  15320. Dec(J);
  15321. Result := 0;
  15322. end;
  15323. {$IFDEF CLR}
  15324. function PosCharSetRevA(const F: CharSet; const S: AnsiString;
  15325. const Index: Integer): Integer;
  15326. var L, I, J : Integer;
  15327. begin
  15328. L := Length(S);
  15329. if (L = 0) or (Index > L) then
  15330. begin
  15331. Result := 0;
  15332. exit;
  15333. end;
  15334. if Index < 1 then
  15335. I := 1
  15336. else
  15337. I := Index;
  15338. J := L;
  15339. while J >= I do
  15340. if S[J] in F then
  15341. begin
  15342. Result := J;
  15343. exit;
  15344. end
  15345. else
  15346. Dec(J);
  15347. Result := 0;
  15348. end;
  15349. {$ELSE}
  15350. function PosCharSetRevA(const F: CharSet; const S: AnsiString; const Index: Integer): Integer;
  15351. var P : PAnsiChar;
  15352. L, I, J : Integer;
  15353. begin
  15354. L := Length(S);
  15355. if (L = 0) or (Index > L) then
  15356. begin
  15357. Result := 0;
  15358. exit;
  15359. end;
  15360. if Index < 1 then
  15361. I := 1
  15362. else
  15363. I := Index;
  15364. P := Pointer(S);
  15365. J := L;
  15366. Inc(P, J - 1);
  15367. while J >= I do
  15368. if P^ in F then
  15369. begin
  15370. Result := J;
  15371. exit;
  15372. end
  15373. else
  15374. begin
  15375. Dec(P);
  15376. Dec(J);
  15377. end;
  15378. Result := 0;
  15379. end;
  15380. function PosCharSetRevW(const F: CharSet; const S: WideString; const Index: Integer): Integer;
  15381. var P : PWideChar;
  15382. L, I, J : Integer;
  15383. C : WideChar;
  15384. begin
  15385. L := Length(S);
  15386. if (L = 0) or (Index > L) then
  15387. begin
  15388. Result := 0;
  15389. exit;
  15390. end;
  15391. if Index < 1 then
  15392. I := 1
  15393. else
  15394. I := Index;
  15395. P := Pointer(S);
  15396. J := L;
  15397. Inc(P, J - 1);
  15398. while J >= I do
  15399. begin
  15400. C := P^;
  15401. if Ord(C) <= $FF then
  15402. if AnsiChar(Ord(C)) in F then
  15403. begin
  15404. Result := J;
  15405. exit;
  15406. end
  15407. else
  15408. begin
  15409. Dec(P);
  15410. Dec(J);
  15411. end;
  15412. end;
  15413. Result := 0;
  15414. end;
  15415. function PosCharSetRevW(const F: TWideCharMatchFunction; const S: WideString; const Index: Integer): Integer;
  15416. var P : PWideChar;
  15417. L, I, J : Integer;
  15418. C : WideChar;
  15419. begin
  15420. L := Length(S);
  15421. if (L = 0) or (Index > L) then
  15422. begin
  15423. Result := 0;
  15424. exit;
  15425. end;
  15426. if Index < 1 then
  15427. I := 1
  15428. else
  15429. I := Index;
  15430. P := Pointer(S);
  15431. J := L;
  15432. Inc(P, J - 1);
  15433. while J >= I do
  15434. begin
  15435. C := P^;
  15436. if F(C) then
  15437. begin
  15438. Result := J;
  15439. exit;
  15440. end
  15441. else
  15442. begin
  15443. Dec(P);
  15444. Dec(J);
  15445. end;
  15446. end;
  15447. Result := 0;
  15448. end;
  15449. function PosCharSetRevU(const F: CharSet; const S: UnicodeString; const Index: Integer): Integer;
  15450. var P : PWideChar;
  15451. L, I, J : Integer;
  15452. C : WideChar;
  15453. begin
  15454. L := Length(S);
  15455. if (L = 0) or (Index > L) then
  15456. begin
  15457. Result := 0;
  15458. exit;
  15459. end;
  15460. if Index < 1 then
  15461. I := 1
  15462. else
  15463. I := Index;
  15464. P := Pointer(S);
  15465. J := L;
  15466. Inc(P, J - 1);
  15467. while J >= I do
  15468. begin
  15469. C := P^;
  15470. if Ord(C) <= $FF then
  15471. if AnsiChar(Ord(C)) in F then
  15472. begin
  15473. Result := J;
  15474. exit;
  15475. end
  15476. else
  15477. begin
  15478. Dec(P);
  15479. Dec(J);
  15480. end;
  15481. end;
  15482. Result := 0;
  15483. end;
  15484. function PosCharSetRevU(const F: TWideCharMatchFunction; const S: UnicodeString; const Index: Integer): Integer;
  15485. var P : PWideChar;
  15486. L, I, J : Integer;
  15487. C : WideChar;
  15488. begin
  15489. L := Length(S);
  15490. if (L = 0) or (Index > L) then
  15491. begin
  15492. Result := 0;
  15493. exit;
  15494. end;
  15495. if Index < 1 then
  15496. I := 1
  15497. else
  15498. I := Index;
  15499. P := Pointer(S);
  15500. J := L;
  15501. Inc(P, J - 1);
  15502. while J >= I do
  15503. begin
  15504. C := P^;
  15505. if F(C) then
  15506. begin
  15507. Result := J;
  15508. exit;
  15509. end
  15510. else
  15511. begin
  15512. Dec(P);
  15513. Dec(J);
  15514. end;
  15515. end;
  15516. Result := 0;
  15517. end;
  15518. function PosCharSetRev(const F: CharSet; const S: String; const Index: Integer): Integer;
  15519. var P : PChar;
  15520. L, I, J : Integer;
  15521. C : Char;
  15522. begin
  15523. L := Length(S);
  15524. if (L = 0) or (Index > L) then
  15525. begin
  15526. Result := 0;
  15527. exit;
  15528. end;
  15529. if Index < 1 then
  15530. I := 1
  15531. else
  15532. I := Index;
  15533. P := Pointer(S);
  15534. J := L;
  15535. Inc(P, J - 1);
  15536. while J >= I do
  15537. begin
  15538. C := P^;
  15539. {$IFDEF StringIsUnicode}
  15540. if Ord(C) <= $FF then
  15541. {$ENDIF}
  15542. if AnsiChar(Ord(C)) in F then
  15543. begin
  15544. Result := J;
  15545. exit;
  15546. end
  15547. else
  15548. begin
  15549. Dec(P);
  15550. Dec(J);
  15551. end;
  15552. end;
  15553. Result := 0;
  15554. end;
  15555. {$ENDIF}
  15556. {$IFDEF CLR}
  15557. function PosStrA(const F, S: AnsiString; const Index: Integer;
  15558. const CaseSensitive: Boolean): Integer;
  15559. var L, M, I : Integer;
  15560. begin
  15561. L := Length(S);
  15562. M := Length(F);
  15563. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15564. begin
  15565. Result := 0;
  15566. exit;
  15567. end;
  15568. if Index < 1 then
  15569. I := 1
  15570. else
  15571. I := Index;
  15572. Dec(L, M - 1);
  15573. if CaseSensitive then
  15574. while I <= L do
  15575. if StrMatch(S, F, I) then
  15576. begin
  15577. Result := I;
  15578. exit;
  15579. end
  15580. else
  15581. Inc(I)
  15582. else
  15583. while I <= L do
  15584. if StrMatchNoCase(S, F, I) then
  15585. begin
  15586. Result := I;
  15587. exit;
  15588. end
  15589. else
  15590. Inc(I);
  15591. Result := 0;
  15592. end;
  15593. {$ELSE}
  15594. function PosStrA(const F, S: AnsiString; const Index: Integer;
  15595. const AsciiCaseSensitive: Boolean): Integer;
  15596. var P, Q : PAnsiChar;
  15597. L, M, I : Integer;
  15598. begin
  15599. L := Length(S);
  15600. M := Length(F);
  15601. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15602. begin
  15603. Result := 0;
  15604. exit;
  15605. end;
  15606. Q := Pointer(F);
  15607. if Index < 1 then
  15608. I := 1
  15609. else
  15610. I := Index;
  15611. P := Pointer(S);
  15612. Inc(P, I - 1);
  15613. Dec(L, M - 1);
  15614. if AsciiCaseSensitive then
  15615. while I <= L do
  15616. if StrPMatchA(P, Q, M) then
  15617. begin
  15618. Result := I;
  15619. exit;
  15620. end else
  15621. begin
  15622. Inc(P);
  15623. Inc(I);
  15624. end
  15625. else
  15626. while I <= L do
  15627. if StrPMatchNoAsciiCaseA(P, Q, M) then
  15628. begin
  15629. Result := I;
  15630. exit;
  15631. end else
  15632. begin
  15633. Inc(P);
  15634. Inc(I);
  15635. end;
  15636. Result := 0;
  15637. end;
  15638. function PosStrW(const F, S: WideString; const Index: Integer;
  15639. const AsciiCaseSensitive: Boolean): Integer;
  15640. var P, Q : PWideChar;
  15641. L, M, I : Integer;
  15642. begin
  15643. L := Length(S);
  15644. M := Length(F);
  15645. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15646. begin
  15647. Result := 0;
  15648. exit;
  15649. end;
  15650. Q := Pointer(F);
  15651. if Index < 1 then
  15652. I := 1
  15653. else
  15654. I := Index;
  15655. P := Pointer(S);
  15656. Inc(P, I - 1);
  15657. Dec(L, M - 1);
  15658. if AsciiCaseSensitive then
  15659. while I <= L do
  15660. if StrPMatchW(P, Q, M) then
  15661. begin
  15662. Result := I;
  15663. exit;
  15664. end else
  15665. begin
  15666. Inc(P);
  15667. Inc(I);
  15668. end
  15669. else
  15670. while I <= L do
  15671. if StrPMatchNoAsciiCaseW(P, Q, M) then
  15672. begin
  15673. Result := I;
  15674. exit;
  15675. end else
  15676. begin
  15677. Inc(P);
  15678. Inc(I);
  15679. end;
  15680. Result := 0;
  15681. end;
  15682. function PosStrAW(const F: AnsiString; const S: WideString; const Index: Integer;
  15683. const AsciiCaseSensitive: Boolean): Integer;
  15684. var P : PWideChar;
  15685. Q : PAnsiChar;
  15686. L, M, I : Integer;
  15687. begin
  15688. L := Length(S);
  15689. M := Length(F);
  15690. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15691. begin
  15692. Result := 0;
  15693. exit;
  15694. end;
  15695. Q := Pointer(F);
  15696. if Index < 1 then
  15697. I := 1
  15698. else
  15699. I := Index;
  15700. P := Pointer(S);
  15701. Inc(P, I - 1);
  15702. Dec(L, M - 1);
  15703. if AsciiCaseSensitive then
  15704. while I <= L do
  15705. if StrPMatchAW(P, Q, M) then
  15706. begin
  15707. Result := I;
  15708. exit;
  15709. end else
  15710. begin
  15711. Inc(P);
  15712. Inc(I);
  15713. end
  15714. else
  15715. while I <= L do
  15716. if StrPMatchNoAsciiCaseAW(P, Q, M) then
  15717. begin
  15718. Result := I;
  15719. exit;
  15720. end else
  15721. begin
  15722. Inc(P);
  15723. Inc(I);
  15724. end;
  15725. Result := 0;
  15726. end;
  15727. function PosStrU(const F, S: UnicodeString; const Index: Integer;
  15728. const AsciiCaseSensitive: Boolean): Integer;
  15729. var P, Q : PWideChar;
  15730. L, M, I : Integer;
  15731. begin
  15732. L := Length(S);
  15733. M := Length(F);
  15734. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15735. begin
  15736. Result := 0;
  15737. exit;
  15738. end;
  15739. Q := Pointer(F);
  15740. if Index < 1 then
  15741. I := 1
  15742. else
  15743. I := Index;
  15744. P := Pointer(S);
  15745. Inc(P, I - 1);
  15746. Dec(L, M - 1);
  15747. if AsciiCaseSensitive then
  15748. while I <= L do
  15749. if StrPMatchW(P, Q, M) then
  15750. begin
  15751. Result := I;
  15752. exit;
  15753. end else
  15754. begin
  15755. Inc(P);
  15756. Inc(I);
  15757. end
  15758. else
  15759. while I <= L do
  15760. if StrPMatchNoAsciiCaseW(P, Q, M) then
  15761. begin
  15762. Result := I;
  15763. exit;
  15764. end else
  15765. begin
  15766. Inc(P);
  15767. Inc(I);
  15768. end;
  15769. Result := 0;
  15770. end;
  15771. function PosStrAU(const F: AnsiString; const S: UnicodeString; const Index: Integer;
  15772. const AsciiCaseSensitive: Boolean): Integer;
  15773. var P : PWideChar;
  15774. Q : PAnsiChar;
  15775. L, M, I : Integer;
  15776. begin
  15777. L := Length(S);
  15778. M := Length(F);
  15779. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15780. begin
  15781. Result := 0;
  15782. exit;
  15783. end;
  15784. Q := Pointer(F);
  15785. if Index < 1 then
  15786. I := 1
  15787. else
  15788. I := Index;
  15789. P := Pointer(S);
  15790. Inc(P, I - 1);
  15791. Dec(L, M - 1);
  15792. if AsciiCaseSensitive then
  15793. while I <= L do
  15794. if StrPMatchAW(P, Q, M) then
  15795. begin
  15796. Result := I;
  15797. exit;
  15798. end else
  15799. begin
  15800. Inc(P);
  15801. Inc(I);
  15802. end
  15803. else
  15804. while I <= L do
  15805. if StrPMatchNoAsciiCaseAW(P, Q, M) then
  15806. begin
  15807. Result := I;
  15808. exit;
  15809. end else
  15810. begin
  15811. Inc(P);
  15812. Inc(I);
  15813. end;
  15814. Result := 0;
  15815. end;
  15816. function PosStr(const F, S: String; const Index: Integer;
  15817. const AsciiCaseSensitive: Boolean): Integer;
  15818. var P, Q : PChar;
  15819. L, M, I : Integer;
  15820. begin
  15821. L := Length(S);
  15822. M := Length(F);
  15823. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15824. begin
  15825. Result := 0;
  15826. exit;
  15827. end;
  15828. Q := Pointer(F);
  15829. if Index < 1 then
  15830. I := 1
  15831. else
  15832. I := Index;
  15833. P := Pointer(S);
  15834. Inc(P, I - 1);
  15835. Dec(L, M - 1);
  15836. if AsciiCaseSensitive then
  15837. while I <= L do
  15838. if StrPMatch(P, Q, M) then
  15839. begin
  15840. Result := I;
  15841. exit;
  15842. end else
  15843. begin
  15844. Inc(P);
  15845. Inc(I);
  15846. end
  15847. else
  15848. while I <= L do
  15849. if StrPMatchNoAsciiCase(P, Q, M) then
  15850. begin
  15851. Result := I;
  15852. exit;
  15853. end else
  15854. begin
  15855. Inc(P);
  15856. Inc(I);
  15857. end;
  15858. Result := 0;
  15859. end;
  15860. {$ENDIF}
  15861. {$IFDEF CLR}
  15862. function PosStrRev(const F, S: AnsiString; const Index: Integer;
  15863. const CaseSensitive: Boolean): Integer;
  15864. var L, M, I, J : Integer;
  15865. begin
  15866. L := Length(S);
  15867. M := Length(F);
  15868. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15869. begin
  15870. Result := 0;
  15871. exit;
  15872. end;
  15873. if Index < 1 then
  15874. I := 1
  15875. else
  15876. I := Index;
  15877. Dec(L, M - 1);
  15878. J := L;
  15879. if CaseSensitive then
  15880. while J >= I do
  15881. if StrMatch(S, F, J) then
  15882. begin
  15883. Result := J;
  15884. exit;
  15885. end
  15886. else
  15887. Dec(J)
  15888. else
  15889. while J >= I do
  15890. if StrMatchNoCase(S, F, J) then
  15891. begin
  15892. Result := J;
  15893. exit;
  15894. end
  15895. else
  15896. Dec(J);
  15897. Result := 0;
  15898. end;
  15899. {$ELSE}
  15900. function PosStrRevA(const F, S: AnsiString; const Index: Integer;
  15901. const AsciiCaseSensitive: Boolean): Integer;
  15902. var P, Q : PAnsiChar;
  15903. L, M, I, J : Integer;
  15904. begin
  15905. L := Length(S);
  15906. M := Length(F);
  15907. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15908. begin
  15909. Result := 0;
  15910. exit;
  15911. end;
  15912. Q := Pointer(F);
  15913. if Index < 1 then
  15914. I := 1
  15915. else
  15916. I := Index;
  15917. P := Pointer(S);
  15918. Dec(L, M - 1);
  15919. Inc(P, L - 1);
  15920. J := L;
  15921. if AsciiCaseSensitive then
  15922. while J >= I do
  15923. if StrPMatchA(P, Q, M) then
  15924. begin
  15925. Result := J;
  15926. exit;
  15927. end else
  15928. begin
  15929. Dec(P);
  15930. Dec(J);
  15931. end
  15932. else
  15933. while J >= I do
  15934. if StrPMatchNoAsciiCaseA(P, Q, M) then
  15935. begin
  15936. Result := J;
  15937. exit;
  15938. end else
  15939. begin
  15940. Dec(P);
  15941. Dec(J);
  15942. end;
  15943. Result := 0;
  15944. end;
  15945. function PosStrRevW(const F, S: WideString; const Index: Integer;
  15946. const AsciiCaseSensitive: Boolean): Integer;
  15947. var P, Q : PWideChar;
  15948. L, M, I, J : Integer;
  15949. begin
  15950. L := Length(S);
  15951. M := Length(F);
  15952. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15953. begin
  15954. Result := 0;
  15955. exit;
  15956. end;
  15957. Q := Pointer(F);
  15958. if Index < 1 then
  15959. I := 1
  15960. else
  15961. I := Index;
  15962. P := Pointer(S);
  15963. Dec(L, M - 1);
  15964. Inc(P, L - 1);
  15965. J := L;
  15966. if AsciiCaseSensitive then
  15967. while J >= I do
  15968. if StrPMatchW(P, Q, M) then
  15969. begin
  15970. Result := J;
  15971. exit;
  15972. end else
  15973. begin
  15974. Dec(P);
  15975. Dec(J);
  15976. end
  15977. else
  15978. while J >= I do
  15979. if StrPMatchNoAsciiCaseW(P, Q, M) then
  15980. begin
  15981. Result := J;
  15982. exit;
  15983. end else
  15984. begin
  15985. Dec(P);
  15986. Dec(J);
  15987. end;
  15988. Result := 0;
  15989. end;
  15990. function PosStrRevU(const F, S: UnicodeString; const Index: Integer;
  15991. const AsciiCaseSensitive: Boolean): Integer;
  15992. var P, Q : PWideChar;
  15993. L, M, I, J : Integer;
  15994. begin
  15995. L := Length(S);
  15996. M := Length(F);
  15997. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  15998. begin
  15999. Result := 0;
  16000. exit;
  16001. end;
  16002. Q := Pointer(F);
  16003. if Index < 1 then
  16004. I := 1
  16005. else
  16006. I := Index;
  16007. P := Pointer(S);
  16008. Dec(L, M - 1);
  16009. Inc(P, L - 1);
  16010. J := L;
  16011. if AsciiCaseSensitive then
  16012. while J >= I do
  16013. if StrPMatchW(P, Q, M) then
  16014. begin
  16015. Result := J;
  16016. exit;
  16017. end else
  16018. begin
  16019. Dec(P);
  16020. Dec(J);
  16021. end
  16022. else
  16023. while J >= I do
  16024. if StrPMatchNoAsciiCaseW(P, Q, M) then
  16025. begin
  16026. Result := J;
  16027. exit;
  16028. end else
  16029. begin
  16030. Dec(P);
  16031. Dec(J);
  16032. end;
  16033. Result := 0;
  16034. end;
  16035. function PosStrRev(const F, S: String; const Index: Integer;
  16036. const AsciiCaseSensitive: Boolean): Integer;
  16037. var P, Q : PChar;
  16038. L, M, I, J : Integer;
  16039. begin
  16040. L := Length(S);
  16041. M := Length(F);
  16042. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  16043. begin
  16044. Result := 0;
  16045. exit;
  16046. end;
  16047. Q := Pointer(F);
  16048. if Index < 1 then
  16049. I := 1
  16050. else
  16051. I := Index;
  16052. P := Pointer(S);
  16053. Dec(L, M - 1);
  16054. Inc(P, L - 1);
  16055. J := L;
  16056. if AsciiCaseSensitive then
  16057. while J >= I do
  16058. if StrPMatch(P, Q, M) then
  16059. begin
  16060. Result := J;
  16061. exit;
  16062. end else
  16063. begin
  16064. Dec(P);
  16065. Dec(J);
  16066. end
  16067. else
  16068. while J >= I do
  16069. if StrPMatchNoAsciiCase(P, Q, M) then
  16070. begin
  16071. Result := J;
  16072. exit;
  16073. end else
  16074. begin
  16075. Dec(P);
  16076. Dec(J);
  16077. end;
  16078. Result := 0;
  16079. end;
  16080. {$ENDIF}
  16081. {$IFDEF CLR}
  16082. function PosStrRevIdx(const F, S: AnsiString; const Index: Integer;
  16083. const CaseSensitive: Boolean): Integer;
  16084. var L, M, I, J : Integer;
  16085. begin
  16086. L := Length(S);
  16087. M := Length(F);
  16088. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  16089. begin
  16090. Result := 0;
  16091. exit;
  16092. end;
  16093. if Index < 1 then
  16094. I := L
  16095. else
  16096. I := Index;
  16097. J := I;
  16098. if CaseSensitive then
  16099. while J >= 1 do
  16100. if StrMatch(S, F, J) then
  16101. begin
  16102. Result := J;
  16103. exit;
  16104. end
  16105. else
  16106. Dec(J)
  16107. else
  16108. while J >= 1 do
  16109. if StrMatchNoCase(S, F, J) then
  16110. begin
  16111. Result := J;
  16112. exit;
  16113. end
  16114. else
  16115. Dec(J);
  16116. Result := 0;
  16117. end;
  16118. {$ELSE}
  16119. function PosStrRevIdxA(const F, S: AnsiString; const Index: Integer;
  16120. const AsciiCaseSensitive: Boolean): Integer;
  16121. var P, Q : PAnsiChar;
  16122. L, M, I, J : Integer;
  16123. begin
  16124. L := Length(S);
  16125. M := Length(F);
  16126. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  16127. begin
  16128. Result := 0;
  16129. exit;
  16130. end;
  16131. Q := Pointer(F);
  16132. if Index < 1 then
  16133. I := L
  16134. else
  16135. I := Index;
  16136. P := Pointer(S);
  16137. Inc(P, I - 1);
  16138. J := I;
  16139. if AsciiCaseSensitive then
  16140. while J >= 1 do
  16141. if StrPMatchA(P, Q, M) then
  16142. begin
  16143. Result := J;
  16144. exit;
  16145. end else
  16146. begin
  16147. Dec(P);
  16148. Dec(J);
  16149. end
  16150. else
  16151. while J >= 1 do
  16152. if StrPMatchNoAsciiCaseA(P, Q, M) then
  16153. begin
  16154. Result := J;
  16155. exit;
  16156. end else
  16157. begin
  16158. Dec(P);
  16159. Dec(J);
  16160. end;
  16161. Result := 0;
  16162. end;
  16163. function PosStrRevIdxW(const F, S: WideString; const Index: Integer;
  16164. const AsciiCaseSensitive: Boolean): Integer;
  16165. var P, Q : PWideChar;
  16166. L, M, I, J : Integer;
  16167. begin
  16168. L := Length(S);
  16169. M := Length(F);
  16170. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  16171. begin
  16172. Result := 0;
  16173. exit;
  16174. end;
  16175. Q := Pointer(F);
  16176. if Index < 1 then
  16177. I := L
  16178. else
  16179. I := Index;
  16180. P := Pointer(S);
  16181. Inc(P, I - 1);
  16182. J := I;
  16183. if AsciiCaseSensitive then
  16184. while J >= 1 do
  16185. if StrPMatchW(P, Q, M) then
  16186. begin
  16187. Result := J;
  16188. exit;
  16189. end else
  16190. begin
  16191. Dec(P);
  16192. Dec(J);
  16193. end
  16194. else
  16195. while J >= 1 do
  16196. if StrPMatchNoAsciiCaseW(P, Q, M) then
  16197. begin
  16198. Result := J;
  16199. exit;
  16200. end else
  16201. begin
  16202. Dec(P);
  16203. Dec(J);
  16204. end;
  16205. Result := 0;
  16206. end;
  16207. function PosStrRevIdxU(const F, S: UnicodeString; const Index: Integer;
  16208. const AsciiCaseSensitive: Boolean): Integer;
  16209. var P, Q : PWideChar;
  16210. L, M, I, J : Integer;
  16211. begin
  16212. L := Length(S);
  16213. M := Length(F);
  16214. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  16215. begin
  16216. Result := 0;
  16217. exit;
  16218. end;
  16219. Q := Pointer(F);
  16220. if Index < 1 then
  16221. I := L
  16222. else
  16223. I := Index;
  16224. P := Pointer(S);
  16225. Inc(P, I - 1);
  16226. J := I;
  16227. if AsciiCaseSensitive then
  16228. while J >= 1 do
  16229. if StrPMatchW(P, Q, M) then
  16230. begin
  16231. Result := J;
  16232. exit;
  16233. end else
  16234. begin
  16235. Dec(P);
  16236. Dec(J);
  16237. end
  16238. else
  16239. while J >= 1 do
  16240. if StrPMatchNoAsciiCaseW(P, Q, M) then
  16241. begin
  16242. Result := J;
  16243. exit;
  16244. end else
  16245. begin
  16246. Dec(P);
  16247. Dec(J);
  16248. end;
  16249. Result := 0;
  16250. end;
  16251. function PosStrRevIdx(const F, S: String; const Index: Integer;
  16252. const AsciiCaseSensitive: Boolean): Integer;
  16253. var P, Q : PChar;
  16254. L, M, I, J : Integer;
  16255. begin
  16256. L := Length(S);
  16257. M := Length(F);
  16258. if (L = 0) or (Index > L) or (M = 0) or (M > L) then
  16259. begin
  16260. Result := 0;
  16261. exit;
  16262. end;
  16263. Q := Pointer(F);
  16264. if Index < 1 then
  16265. I := L
  16266. else
  16267. I := Index;
  16268. P := Pointer(S);
  16269. Inc(P, I - 1);
  16270. J := I;
  16271. if AsciiCaseSensitive then
  16272. while J >= 1 do
  16273. if StrPMatch(P, Q, M) then
  16274. begin
  16275. Result := J;
  16276. exit;
  16277. end else
  16278. begin
  16279. Dec(P);
  16280. Dec(J);
  16281. end
  16282. else
  16283. while J >= 1 do
  16284. if StrPMatchNoAsciiCase(P, Q, M) then
  16285. begin
  16286. Result := J;
  16287. exit;
  16288. end else
  16289. begin
  16290. Dec(P);
  16291. Dec(J);
  16292. end;
  16293. Result := 0;
  16294. end;
  16295. {$ENDIF}
  16296. function PosNStrA(const F, S: AnsiString; const N: Integer;
  16297. const Index: Integer; const AsciiCaseSensitive: Boolean): Integer;
  16298. var I, J, M: Integer;
  16299. begin
  16300. Result := 0;
  16301. if N <= 0 then
  16302. exit;
  16303. M := Length(F);
  16304. if M = 0 then
  16305. exit;
  16306. J := Index;
  16307. for I := 1 to N do
  16308. begin
  16309. Result := PosStrA(F, S, J, AsciiCaseSensitive);
  16310. if Result = 0 then
  16311. exit;
  16312. J := Result + M;
  16313. end;
  16314. end;
  16315. function PosNStrW(const F, S: WideString; const N: Integer;
  16316. const Index: Integer; const AsciiCaseSensitive: Boolean): Integer;
  16317. var I, J, M: Integer;
  16318. begin
  16319. Result := 0;
  16320. if N <= 0 then
  16321. exit;
  16322. M := Length(F);
  16323. if M = 0 then
  16324. exit;
  16325. J := Index;
  16326. for I := 1 to N do
  16327. begin
  16328. Result := PosStrW(F, S, J, AsciiCaseSensitive);
  16329. if Result = 0 then
  16330. exit;
  16331. J := Result + M;
  16332. end;
  16333. end;
  16334. function PosNStrU(const F, S: UnicodeString; const N: Integer;
  16335. const Index: Integer; const AsciiCaseSensitive: Boolean): Integer;
  16336. var I, J, M: Integer;
  16337. begin
  16338. Result := 0;
  16339. if N <= 0 then
  16340. exit;
  16341. M := Length(F);
  16342. if M = 0 then
  16343. exit;
  16344. J := Index;
  16345. for I := 1 to N do
  16346. begin
  16347. Result := PosStrU(F, S, J, AsciiCaseSensitive);
  16348. if Result = 0 then
  16349. exit;
  16350. J := Result + M;
  16351. end;
  16352. end;
  16353. function PosNStr(const F, S: String; const N: Integer;
  16354. const Index: Integer; const AsciiCaseSensitive: Boolean): Integer;
  16355. var I, J, M: Integer;
  16356. begin
  16357. Result := 0;
  16358. if N <= 0 then
  16359. exit;
  16360. M := Length(F);
  16361. if M = 0 then
  16362. exit;
  16363. J := Index;
  16364. for I := 1 to N do
  16365. begin
  16366. Result := PosStr(F, S, J, AsciiCaseSensitive);
  16367. if Result = 0 then
  16368. exit;
  16369. J := Result + M;
  16370. end;
  16371. end;
  16372. { }
  16373. { Copy variations }
  16374. { }
  16375. function CopyRangeA(const S: AnsiString; const StartIndex, StopIndex: Integer): AnsiString;
  16376. var L, I : Integer;
  16377. begin
  16378. L := Length(S);
  16379. if (StartIndex > StopIndex) or (StopIndex < 1) or (StartIndex > L) or (L = 0) then
  16380. Result := ''
  16381. else
  16382. begin
  16383. if StartIndex <= 1 then
  16384. if StopIndex >= L then
  16385. begin
  16386. Result := S;
  16387. exit;
  16388. end
  16389. else
  16390. I := 1
  16391. else
  16392. I := StartIndex;
  16393. Result := Copy(S, I, StopIndex - I + 1);
  16394. end;
  16395. end;
  16396. function CopyRangeW(const S: WideString; const StartIndex, StopIndex: Integer): WideString;
  16397. var L, I : Integer;
  16398. begin
  16399. L := Length(S);
  16400. if (StartIndex > StopIndex) or (StopIndex < 1) or (StartIndex > L) or (L = 0) then
  16401. Result := ''
  16402. else
  16403. begin
  16404. if StartIndex <= 1 then
  16405. if StopIndex >= L then
  16406. begin
  16407. Result := S;
  16408. exit;
  16409. end
  16410. else
  16411. I := 1
  16412. else
  16413. I := StartIndex;
  16414. Result := Copy(S, I, StopIndex - I + 1);
  16415. end;
  16416. end;
  16417. function CopyRangeU(const S: UnicodeString; const StartIndex, StopIndex: Integer): UnicodeString;
  16418. var L, I : Integer;
  16419. begin
  16420. L := Length(S);
  16421. if (StartIndex > StopIndex) or (StopIndex < 1) or (StartIndex > L) or (L = 0) then
  16422. Result := ''
  16423. else
  16424. begin
  16425. if StartIndex <= 1 then
  16426. if StopIndex >= L then
  16427. begin
  16428. Result := S;
  16429. exit;
  16430. end
  16431. else
  16432. I := 1
  16433. else
  16434. I := StartIndex;
  16435. Result := Copy(S, I, StopIndex - I + 1);
  16436. end;
  16437. end;
  16438. function CopyRange(const S: String; const StartIndex, StopIndex: Integer): String;
  16439. var L, I : Integer;
  16440. begin
  16441. L := Length(S);
  16442. if (StartIndex > StopIndex) or (StopIndex < 1) or (StartIndex > L) or (L = 0) then
  16443. Result := ''
  16444. else
  16445. begin
  16446. if StartIndex <= 1 then
  16447. if StopIndex >= L then
  16448. begin
  16449. Result := S;
  16450. exit;
  16451. end
  16452. else
  16453. I := 1
  16454. else
  16455. I := StartIndex;
  16456. Result := Copy(S, I, StopIndex - I + 1);
  16457. end;
  16458. end;
  16459. function CopyFromA(const S: AnsiString; const Index: Integer): AnsiString;
  16460. var L : Integer;
  16461. begin
  16462. if Index <= 1 then
  16463. Result := S
  16464. else
  16465. begin
  16466. L := Length(S);
  16467. if (L = 0) or (Index > L) then
  16468. Result := ''
  16469. else
  16470. Result := Copy(S, Index, L - Index + 1);
  16471. end;
  16472. end;
  16473. function CopyFromW(const S: WideString; const Index: Integer): WideString;
  16474. var L : Integer;
  16475. begin
  16476. if Index <= 1 then
  16477. Result := S
  16478. else
  16479. begin
  16480. L := Length(S);
  16481. if (L = 0) or (Index > L) then
  16482. Result := ''
  16483. else
  16484. Result := Copy(S, Index, L - Index + 1);
  16485. end;
  16486. end;
  16487. function CopyFromU(const S: UnicodeString; const Index: Integer): UnicodeString;
  16488. var L : Integer;
  16489. begin
  16490. if Index <= 1 then
  16491. Result := S
  16492. else
  16493. begin
  16494. L := Length(S);
  16495. if (L = 0) or (Index > L) then
  16496. Result := ''
  16497. else
  16498. Result := Copy(S, Index, L - Index + 1);
  16499. end;
  16500. end;
  16501. function CopyFrom(const S: String; const Index: Integer): String;
  16502. var L : Integer;
  16503. begin
  16504. if Index <= 1 then
  16505. Result := S
  16506. else
  16507. begin
  16508. L := Length(S);
  16509. if (L = 0) or (Index > L) then
  16510. Result := ''
  16511. else
  16512. Result := Copy(S, Index, L - Index + 1);
  16513. end;
  16514. end;
  16515. function CopyLeftA(const S: AnsiString; const Count: Integer): AnsiString;
  16516. var L : Integer;
  16517. begin
  16518. L := Length(S);
  16519. if (L = 0) or (Count <= 0) then
  16520. Result := '' else
  16521. if Count >= L then
  16522. Result := S
  16523. else
  16524. Result := Copy(S, 1, Count);
  16525. end;
  16526. function CopyLeftW(const S: WideString; const Count: Integer): WideString;
  16527. var L : Integer;
  16528. begin
  16529. L := Length(S);
  16530. if (L = 0) or (Count <= 0) then
  16531. Result := '' else
  16532. if Count >= L then
  16533. Result := S
  16534. else
  16535. Result := Copy(S, 1, Count);
  16536. end;
  16537. function CopyLeftU(const S: UnicodeString; const Count: Integer): UnicodeString;
  16538. var L : Integer;
  16539. begin
  16540. L := Length(S);
  16541. if (L = 0) or (Count <= 0) then
  16542. Result := '' else
  16543. if Count >= L then
  16544. Result := S
  16545. else
  16546. Result := Copy(S, 1, Count);
  16547. end;
  16548. function CopyLeft(const S: String; const Count: Integer): String;
  16549. var L : Integer;
  16550. begin
  16551. L := Length(S);
  16552. if (L = 0) or (Count <= 0) then
  16553. Result := '' else
  16554. if Count >= L then
  16555. Result := S
  16556. else
  16557. Result := Copy(S, 1, Count);
  16558. end;
  16559. function CopyRightA(const S: AnsiString; const Count: Integer): AnsiString;
  16560. var L : Integer;
  16561. begin
  16562. L := Length(S);
  16563. if (L = 0) or (Count <= 0) then
  16564. Result := '' else
  16565. if Count >= L then
  16566. Result := S
  16567. else
  16568. Result := Copy(S, L - Count + 1, Count);
  16569. end;
  16570. function CopyRightW(const S: WideString; const Count: Integer): WideString;
  16571. var L : Integer;
  16572. begin
  16573. L := Length(S);
  16574. if (L = 0) or (Count <= 0) then
  16575. Result := '' else
  16576. if Count >= L then
  16577. Result := S
  16578. else
  16579. Result := Copy(S, L - Count + 1, Count);
  16580. end;
  16581. function CopyRightU(const S: UnicodeString; const Count: Integer): UnicodeString;
  16582. var L : Integer;
  16583. begin
  16584. L := Length(S);
  16585. if (L = 0) or (Count <= 0) then
  16586. Result := '' else
  16587. if Count >= L then
  16588. Result := S
  16589. else
  16590. Result := Copy(S, L - Count + 1, Count);
  16591. end;
  16592. function CopyRight(const S: String; const Count: Integer): String;
  16593. var L : Integer;
  16594. begin
  16595. L := Length(S);
  16596. if (L = 0) or (Count <= 0) then
  16597. Result := '' else
  16598. if Count >= L then
  16599. Result := S
  16600. else
  16601. Result := Copy(S, L - Count + 1, Count);
  16602. end;
  16603. function CopyLeftEllipsedA(const S: AnsiString; const Count: Integer): AnsiString;
  16604. var L: Integer;
  16605. begin
  16606. if Count < 0 then
  16607. begin
  16608. Result := S;
  16609. exit;
  16610. end;
  16611. if Count = 0 then
  16612. begin
  16613. Result := '';
  16614. exit;
  16615. end;
  16616. L := Length(S);
  16617. if L <= Count then
  16618. begin
  16619. Result := S;
  16620. exit;
  16621. end;
  16622. if Count <= 3 then
  16623. begin
  16624. Result := DupCharA(' ', Count);
  16625. exit;
  16626. end;
  16627. Result := Copy(S, 1, Count - 3) + '...';
  16628. end;
  16629. { }
  16630. { CopyEx }
  16631. { }
  16632. { TranslateStartStop translates Start, Stop parameters (negative values are }
  16633. { indexed from back of string) into StartIdx and StopIdx (relative to start). }
  16634. { Returns False if the Start, Stop does not specify a valid range. }
  16635. function TranslateStart(const Len, Start: Integer; var StartIndex : Integer): Boolean;
  16636. begin
  16637. if Len = 0 then
  16638. Result := False
  16639. else
  16640. begin
  16641. StartIndex := Start;
  16642. if Start < 0 then
  16643. Inc(StartIndex, Len + 1);
  16644. if StartIndex > Len then
  16645. Result := False
  16646. else
  16647. begin
  16648. if StartIndex < 1 then
  16649. StartIndex := 1;
  16650. Result := True;
  16651. end;
  16652. end;
  16653. end;
  16654. function TranslateStartStop(const Len, Start, Stop: Integer; var StartIndex, StopIndex: Integer): Boolean;
  16655. begin
  16656. if Len = 0 then
  16657. Result := False
  16658. else
  16659. begin
  16660. StartIndex := Start;
  16661. if Start < 0 then
  16662. Inc(StartIndex, Len + 1);
  16663. StopIndex := Stop;
  16664. if StopIndex < 0 then
  16665. Inc(StopIndex, Len + 1);
  16666. if (StopIndex < 1) or (StartIndex > Len) or (StopIndex < StartIndex) then
  16667. Result := False
  16668. else
  16669. begin
  16670. if StopIndex > Len then
  16671. StopIndex:= Len;
  16672. if StartIndex < 1 then
  16673. StartIndex := 1;
  16674. Result := True;
  16675. end;
  16676. end;
  16677. end;
  16678. function CopyExA(const S: AnsiString; const Start, Count: Integer): AnsiString;
  16679. var I, L : Integer;
  16680. begin
  16681. L := Length(S);
  16682. if (Count < 0) or not TranslateStart(L, Start, I) then
  16683. Result := '' else
  16684. if (I = 1) and (Count >= L) then
  16685. Result := S
  16686. else
  16687. Result := Copy(S, I, Count);
  16688. end;
  16689. function CopyExW(const S: String; const Start, Count: Integer): String;
  16690. var I, L : Integer;
  16691. begin
  16692. L := Length(S);
  16693. if (Count < 0) or not TranslateStart(L, Start, I) then
  16694. Result := '' else
  16695. if (I = 1) and (Count >= L) then
  16696. Result := S
  16697. else
  16698. Result := Copy(S, I, Count);
  16699. end;
  16700. function CopyExU(const S: UnicodeString; const Start, Count: Integer): UnicodeString;
  16701. var I, L : Integer;
  16702. begin
  16703. L := Length(S);
  16704. if (Count < 0) or not TranslateStart(L, Start, I) then
  16705. Result := '' else
  16706. if (I = 1) and (Count >= L) then
  16707. Result := S
  16708. else
  16709. Result := Copy(S, I, Count);
  16710. end;
  16711. function CopyEx(const S: String; const Start, Count: Integer): String;
  16712. var I, L : Integer;
  16713. begin
  16714. L := Length(S);
  16715. if (Count < 0) or not TranslateStart(L, Start, I) then
  16716. Result := '' else
  16717. if (I = 1) and (Count >= L) then
  16718. Result := S
  16719. else
  16720. Result := Copy(S, I, Count);
  16721. end;
  16722. function CopyRangeExA(const S: AnsiString; const Start, Stop: Integer): AnsiString;
  16723. var I, J, L : Integer;
  16724. begin
  16725. L := Length(S);
  16726. if not TranslateStartStop(L, Start, Stop, I, J) then
  16727. Result := '' else
  16728. if (I = 1) and (J = L) then
  16729. Result := S
  16730. else
  16731. Result := Copy(S, I, J - I + 1);
  16732. end;
  16733. function CopyRangeExW(const S: WideString; const Start, Stop: Integer): WideString;
  16734. var I, J, L : Integer;
  16735. begin
  16736. L := Length(S);
  16737. if not TranslateStartStop(L, Start, Stop, I, J) then
  16738. Result := '' else
  16739. if (I = 1) and (J = L) then
  16740. Result := S
  16741. else
  16742. Result := Copy(S, I, J - I + 1);
  16743. end;
  16744. function CopyRangeExU(const S: UnicodeString; const Start, Stop: Integer): UnicodeString;
  16745. var I, J, L : Integer;
  16746. begin
  16747. L := Length(S);
  16748. if not TranslateStartStop(L, Start, Stop, I, J) then
  16749. Result := '' else
  16750. if (I = 1) and (J = L) then
  16751. Result := S
  16752. else
  16753. Result := Copy(S, I, J - I + 1);
  16754. end;
  16755. function CopyRangeEx(const S: String; const Start, Stop: Integer): String;
  16756. var I, J, L : Integer;
  16757. begin
  16758. L := Length(S);
  16759. if not TranslateStartStop(L, Start, Stop, I, J) then
  16760. Result := '' else
  16761. if (I = 1) and (J = L) then
  16762. Result := S
  16763. else
  16764. Result := Copy(S, I, J - I + 1);
  16765. end;
  16766. function CopyFromExA(const S: AnsiString; const Start: Integer): AnsiString;
  16767. var I, L : Integer;
  16768. begin
  16769. L := Length(S);
  16770. if not TranslateStart(L, Start, I) then
  16771. Result := '' else
  16772. if I <= 1 then
  16773. Result := S
  16774. else
  16775. Result := Copy(S, I, L - I + 1);
  16776. end;
  16777. function CopyFromExW(const S: WideString; const Start: Integer): WideString;
  16778. var I, L : Integer;
  16779. begin
  16780. L := Length(S);
  16781. if not TranslateStart(L, Start, I) then
  16782. Result := '' else
  16783. if I <= 1 then
  16784. Result := S
  16785. else
  16786. Result := Copy(S, I, L - I + 1);
  16787. end;
  16788. function CopyFromExU(const S: UnicodeString; const Start: Integer): UnicodeString;
  16789. var I, L : Integer;
  16790. begin
  16791. L := Length(S);
  16792. if not TranslateStart(L, Start, I) then
  16793. Result := '' else
  16794. if I <= 1 then
  16795. Result := S
  16796. else
  16797. Result := Copy(S, I, L - I + 1);
  16798. end;
  16799. function CopyFromEx(const S: String; const Start: Integer): String;
  16800. var I, L : Integer;
  16801. begin
  16802. L := Length(S);
  16803. if not TranslateStart(L, Start, I) then
  16804. Result := '' else
  16805. if I <= 1 then
  16806. Result := S
  16807. else
  16808. Result := Copy(S, I, L - I + 1);
  16809. end;
  16810. { }
  16811. { Trim }
  16812. { }
  16813. function StrTrimLeftA(const S: AnsiString; const C: CharSet): AnsiString;
  16814. var F, L : Integer;
  16815. begin
  16816. L := Length(S);
  16817. F := 1;
  16818. while (F <= L) and (S[F] in C) do
  16819. Inc(F);
  16820. Result := CopyFromA(S, F);
  16821. end;
  16822. function StrTrimLeftW(const S: WideString; const C: CharSet): WideString;
  16823. var F, L : Integer;
  16824. begin
  16825. L := Length(S);
  16826. F := 1;
  16827. while (F <= L) and WideCharInCharSet(S[F], C) do
  16828. Inc(F);
  16829. Result := CopyFromW(S, F);
  16830. end;
  16831. function StrTrimLeftW(const S: WideString; const C: TWideCharMatchFunction): WideString;
  16832. var F, L : Integer;
  16833. begin
  16834. L := Length(S);
  16835. F := 1;
  16836. while (F <= L) and C(S[F]) do
  16837. Inc(F);
  16838. Result := CopyFromW(S, F);
  16839. end;
  16840. function StrTrimLeftU(const S: UnicodeString; const C: CharSet): UnicodeString;
  16841. var F, L : Integer;
  16842. begin
  16843. L := Length(S);
  16844. F := 1;
  16845. while (F <= L) and WideCharInCharSet(S[F], C) do
  16846. Inc(F);
  16847. Result := CopyFromU(S, F);
  16848. end;
  16849. function StrTrimLeftU(const S: UnicodeString; const C: TWideCharMatchFunction): UnicodeString;
  16850. var F, L : Integer;
  16851. begin
  16852. L := Length(S);
  16853. F := 1;
  16854. while (F <= L) and C(S[F]) do
  16855. Inc(F);
  16856. Result := CopyFromU(S, F);
  16857. end;
  16858. function StrTrimLeft(const S: String; const C: CharSet): String;
  16859. begin
  16860. {$IFDEF StringIsUnicode}
  16861. Result := StrTrimLeftU(S, C);
  16862. {$ELSE}
  16863. Result := StrTrimLeftA(S, C);
  16864. {$ENDIF}
  16865. end;
  16866. {$IFDEF CLR}
  16867. procedure StrTrimLeftInPlace(var S: AnsiString; const C: CharSet);
  16868. var F, L, I : Integer;
  16869. begin
  16870. L := Length(S);
  16871. F := 1;
  16872. while (F <= L) and (S[F] in C) do
  16873. Inc(F);
  16874. if F > L then
  16875. S := '' else
  16876. if F > 1 then
  16877. begin
  16878. L := L - F + 1;
  16879. if L > 0 then
  16880. for I := 1 to L do
  16881. S[I] := S[I + F];
  16882. SetLength(S, L);
  16883. end;
  16884. end;
  16885. {$ELSE}
  16886. procedure StrTrimLeftInPlaceA(var S: AnsiString; const C: CharSet);
  16887. var F, L : Integer;
  16888. P : PAnsiChar;
  16889. begin
  16890. L := Length(S);
  16891. F := 1;
  16892. while (F <= L) and (S[F] in C) do
  16893. Inc(F);
  16894. if F > L then
  16895. S := '' else
  16896. if F > 1 then
  16897. begin
  16898. L := L - F + 1;
  16899. if L > 0 then
  16900. begin
  16901. P := Pointer(S);
  16902. Inc(P, F - 1);
  16903. MoveMem(P^, Pointer(S)^, L);
  16904. end;
  16905. SetLength(S, L);
  16906. end;
  16907. end;
  16908. procedure StrTrimLeftInPlaceW(var S: WideString; const C: CharSet);
  16909. var F, L : Integer;
  16910. P : PWideChar;
  16911. begin
  16912. L := Length(S);
  16913. F := 1;
  16914. while (F <= L) and CharSetMatchCharW(C, S[F], True) do
  16915. Inc(F);
  16916. if F > L then
  16917. S := '' else
  16918. if F > 1 then
  16919. begin
  16920. L := L - F + 1;
  16921. if L > 0 then
  16922. begin
  16923. P := Pointer(S);
  16924. Inc(P, F - 1);
  16925. MoveMem(P^, Pointer(S)^, L * SizeOf(WideChar));
  16926. end;
  16927. SetLength(S, L);
  16928. end;
  16929. end;
  16930. procedure StrTrimLeftInPlaceW(var S: WideString; const C: TWideCharMatchFunction);
  16931. var F, L : Integer;
  16932. P : PWideChar;
  16933. begin
  16934. L := Length(S);
  16935. F := 1;
  16936. while (F <= L) and C(S[F]) do
  16937. Inc(F);
  16938. if F > L then
  16939. S := '' else
  16940. if F > 1 then
  16941. begin
  16942. L := L - F + 1;
  16943. if L > 0 then
  16944. begin
  16945. P := Pointer(S);
  16946. Inc(P, F - 1);
  16947. MoveMem(P^, Pointer(S)^, L * SizeOf(WideChar));
  16948. end;
  16949. SetLength(S, L);
  16950. end;
  16951. end;
  16952. procedure StrTrimLeftInPlaceU(var S: UnicodeString; const C: CharSet);
  16953. var F, L : Integer;
  16954. P : PWideChar;
  16955. begin
  16956. L := Length(S);
  16957. F := 1;
  16958. while (F <= L) and CharSetMatchCharW(C, S[F], True) do
  16959. Inc(F);
  16960. if F > L then
  16961. S := '' else
  16962. if F > 1 then
  16963. begin
  16964. L := L - F + 1;
  16965. if L > 0 then
  16966. begin
  16967. P := Pointer(S);
  16968. Inc(P, F - 1);
  16969. MoveMem(P^, Pointer(S)^, L * SizeOf(WideChar));
  16970. end;
  16971. SetLength(S, L);
  16972. end;
  16973. end;
  16974. procedure StrTrimLeftInPlaceU(var S: UnicodeString; const C: TWideCharMatchFunction);
  16975. var F, L : Integer;
  16976. P : PWideChar;
  16977. begin
  16978. L := Length(S);
  16979. F := 1;
  16980. while (F <= L) and C(S[F]) do
  16981. Inc(F);
  16982. if F > L then
  16983. S := '' else
  16984. if F > 1 then
  16985. begin
  16986. L := L - F + 1;
  16987. if L > 0 then
  16988. begin
  16989. P := Pointer(S);
  16990. Inc(P, F - 1);
  16991. MoveMem(P^, Pointer(S)^, L * SizeOf(WideChar));
  16992. end;
  16993. SetLength(S, L);
  16994. end;
  16995. end;
  16996. procedure StrTrimLeftInPlace(var S: String; const C: CharSet);
  16997. var F, L : Integer;
  16998. P : PChar;
  16999. begin
  17000. L := Length(S);
  17001. F := 1;
  17002. while (F <= L) and CharSetMatchChar(C, S[F], True) do
  17003. Inc(F);
  17004. if F > L then
  17005. S := '' else
  17006. if F > 1 then
  17007. begin
  17008. L := L - F + 1;
  17009. if L > 0 then
  17010. begin
  17011. P := Pointer(S);
  17012. Inc(P, F - 1);
  17013. MoveMem(P^, Pointer(S)^, L * SizeOf(Char));
  17014. end;
  17015. SetLength(S, L);
  17016. end;
  17017. end;
  17018. {$ENDIF}
  17019. function StrTrimLeftStrNoCaseA(const S: AnsiString; const TrimStr: AnsiString): AnsiString;
  17020. var F, L, M : Integer;
  17021. begin
  17022. L := Length(TrimStr);
  17023. M := Length(S);
  17024. F := 1;
  17025. while (F <= M) and StrMatchNoAsciiCaseA(S, TrimStr, F) do
  17026. Inc(F, L);
  17027. Result := CopyFromA(S, F);
  17028. end;
  17029. function StrTrimLeftStrNoCaseW(const S: WideString; const TrimStr: WideString): WideString;
  17030. var F, L, M : Integer;
  17031. begin
  17032. L := Length(TrimStr);
  17033. M := Length(S);
  17034. F := 1;
  17035. while (F <= M) and StrMatchNoAsciiCaseW(S, TrimStr, F) do
  17036. Inc(F, L);
  17037. Result := CopyFromW(S, F);
  17038. end;
  17039. function StrTrimLeftStrNoCaseU(const S: UnicodeString; const TrimStr: WideString): UnicodeString;
  17040. var F, L, M : Integer;
  17041. begin
  17042. L := Length(TrimStr);
  17043. M := Length(S);
  17044. F := 1;
  17045. while (F <= M) and StrMatchNoAsciiCaseU(S, TrimStr, F) do
  17046. Inc(F, L);
  17047. Result := CopyFromU(S, F);
  17048. end;
  17049. function StrTrimLeftStrNoCase(const S: String; const TrimStr: String): String;
  17050. var F, L, M : Integer;
  17051. begin
  17052. L := Length(TrimStr);
  17053. M := Length(S);
  17054. F := 1;
  17055. while (F <= M) and StrMatchNoAsciiCase(S, TrimStr, F) do
  17056. Inc(F, L);
  17057. Result := CopyFrom(S, F);
  17058. end;
  17059. function StrTrimRightA(const S: AnsiString; const C: CharSet): AnsiString;
  17060. var F : Integer;
  17061. begin
  17062. F := Length(S);
  17063. while (F >= 1) and (S[F] in C) do
  17064. Dec(F);
  17065. Result := CopyLeftA(S, F);
  17066. end;
  17067. function StrTrimRightW(const S: WideString; const C: CharSet): WideString;
  17068. var F : Integer;
  17069. begin
  17070. F := Length(S);
  17071. while (F >= 1) and WideCharInCharSet(S[F], C) do
  17072. Dec(F);
  17073. Result := CopyLeftW(S, F);
  17074. end;
  17075. function StrTrimRightW(const S: WideString; const C: TWideCharMatchFunction): WideString;
  17076. var F : Integer;
  17077. begin
  17078. F := Length(S);
  17079. while (F >= 1) and C(S[F]) do
  17080. Dec(F);
  17081. Result := CopyLeftW(S, F);
  17082. end;
  17083. function StrTrimRightU(const S: UnicodeString; const C: CharSet): UnicodeString;
  17084. var F : Integer;
  17085. begin
  17086. F := Length(S);
  17087. while (F >= 1) and WideCharInCharSet(S[F], C) do
  17088. Dec(F);
  17089. Result := CopyLeftU(S, F);
  17090. end;
  17091. function StrTrimRightU(const S: UnicodeString; const C: TWideCharMatchFunction): UnicodeString;
  17092. var F : Integer;
  17093. begin
  17094. F := Length(S);
  17095. while (F >= 1) and C(S[F]) do
  17096. Dec(F);
  17097. Result := CopyLeftU(S, F);
  17098. end;
  17099. function StrTrimRight(const S: String; const C: CharSet): String;
  17100. begin
  17101. {$IFDEF StringIsUnicode}
  17102. Result := StrTrimRightU(S, C);
  17103. {$ELSE}
  17104. Result := StrTrimRightA(S, C);
  17105. {$ENDIF}
  17106. end;
  17107. procedure StrTrimRightInPlaceA(var S: AnsiString; const C: CharSet);
  17108. var F : Integer;
  17109. begin
  17110. F := Length(S);
  17111. while (F >= 1) and (S[F] in C) do
  17112. Dec(F);
  17113. if F = 0 then
  17114. S := ''
  17115. else
  17116. SetLength(S, F);
  17117. end;
  17118. procedure StrTrimRightInPlaceW(var S: WideString; const C: CharSet);
  17119. var F : Integer;
  17120. begin
  17121. F := Length(S);
  17122. while (F >= 1) and CharSetMatchCharW(C, S[F], True) do
  17123. Dec(F);
  17124. if F = 0 then
  17125. S := ''
  17126. else
  17127. SetLength(S, F);
  17128. end;
  17129. procedure StrTrimRightInPlaceW(var S: WideString; const C: TWideCharMatchFunction);
  17130. var F : Integer;
  17131. begin
  17132. F := Length(S);
  17133. while (F >= 1) and C(S[F]) do
  17134. Dec(F);
  17135. if F = 0 then
  17136. S := ''
  17137. else
  17138. SetLength(S, F);
  17139. end;
  17140. procedure StrTrimRightInPlaceU(var S: UnicodeString; const C: CharSet);
  17141. var F : Integer;
  17142. begin
  17143. F := Length(S);
  17144. while (F >= 1) and CharSetMatchCharW(C, S[F], True) do
  17145. Dec(F);
  17146. if F = 0 then
  17147. S := ''
  17148. else
  17149. SetLength(S, F);
  17150. end;
  17151. procedure StrTrimRightInPlaceU(var S: UnicodeString; const C: TWideCharMatchFunction);
  17152. var F : Integer;
  17153. begin
  17154. F := Length(S);
  17155. while (F >= 1) and C(S[F]) do
  17156. Dec(F);
  17157. if F = 0 then
  17158. S := ''
  17159. else
  17160. SetLength(S, F);
  17161. end;
  17162. procedure StrTrimRightInPlace(var S: String; const C: CharSet);
  17163. var F : Integer;
  17164. begin
  17165. F := Length(S);
  17166. while (F >= 1) and CharSetMatchChar(C, S[F], True) do
  17167. Dec(F);
  17168. if F = 0 then
  17169. S := ''
  17170. else
  17171. SetLength(S, F);
  17172. end;
  17173. function StrTrimRightStrNoCaseA(const S: AnsiString; const TrimStr: AnsiString): AnsiString;
  17174. var F, L : Integer;
  17175. begin
  17176. L := Length(TrimStr);
  17177. F := Length(S) - L + 1;
  17178. while (F >= 1) and StrMatchNoAsciiCaseA(S, TrimStr, F) do
  17179. Dec(F, L);
  17180. Result := CopyLeftA(S, F + L - 1);
  17181. end;
  17182. function StrTrimRightStrNoCaseW(const S: WideString; const TrimStr: WideString): WideString;
  17183. var F, L : Integer;
  17184. begin
  17185. L := Length(TrimStr);
  17186. F := Length(S) - L + 1;
  17187. while (F >= 1) and StrMatchNoAsciiCaseW(S, TrimStr, F) do
  17188. Dec(F, L);
  17189. Result := CopyLeftW(S, F + L - 1);
  17190. end;
  17191. function StrTrimRightStrNoCaseU(const S: UnicodeString; const TrimStr: UnicodeString): UnicodeString;
  17192. var F, L : Integer;
  17193. begin
  17194. L := Length(TrimStr);
  17195. F := Length(S) - L + 1;
  17196. while (F >= 1) and StrMatchNoAsciiCaseU(S, TrimStr, F) do
  17197. Dec(F, L);
  17198. Result := CopyLeftU(S, F + L - 1);
  17199. end;
  17200. function StrTrimRightStrNoCase(const S: String; const TrimStr: String): String;
  17201. var F, L : Integer;
  17202. begin
  17203. L := Length(TrimStr);
  17204. F := Length(S) - L + 1;
  17205. while (F >= 1) and StrMatchNoAsciiCase(S, TrimStr, F) do
  17206. Dec(F, L);
  17207. Result := CopyLeft(S, F + L - 1);
  17208. end;
  17209. function StrTrimA(const S: AnsiString; const C: CharSet): AnsiString;
  17210. var F, G, L : Integer;
  17211. begin
  17212. L := Length(S);
  17213. F := 1;
  17214. while (F <= L) and (S[F] in C) do
  17215. Inc(F);
  17216. G := L;
  17217. while (G >= F) and (S[G] in C) do
  17218. Dec(G);
  17219. Result := CopyRangeA(S, F, G);
  17220. end;
  17221. function StrTrimW(const S: WideString; const C: CharSet): WideString;
  17222. var F, G, L : Integer;
  17223. begin
  17224. L := Length(S);
  17225. F := 1;
  17226. while (F <= L) and WideCharInCharSet(S[F], C) do
  17227. Inc(F);
  17228. G := L;
  17229. while (G >= F) and WideCharInCharSet(S[G], C) do
  17230. Dec(G);
  17231. Result := CopyRangeW(S, F, G);
  17232. end;
  17233. function StrTrimW(const S: WideString; const C: TWideCharMatchFunction): WideString;
  17234. var F, G, L : Integer;
  17235. begin
  17236. L := Length(S);
  17237. F := 1;
  17238. while (F <= L) and C(S[F]) do
  17239. Inc(F);
  17240. G := L;
  17241. while (G >= F) and C(S[G]) do
  17242. Dec(G);
  17243. Result := CopyRangeW(S, F, G);
  17244. end;
  17245. function StrTrimU(const S: UnicodeString; const C: CharSet): UnicodeString;
  17246. var F, G, L : Integer;
  17247. begin
  17248. L := Length(S);
  17249. F := 1;
  17250. while (F <= L) and WideCharInCharSet(S[F], C) do
  17251. Inc(F);
  17252. G := L;
  17253. while (G >= F) and WideCharInCharSet(S[G], C) do
  17254. Dec(G);
  17255. Result := CopyRangeU(S, F, G);
  17256. end;
  17257. function StrTrimU(const S: UnicodeString; const C: TWideCharMatchFunction): UnicodeString;
  17258. var F, G, L : Integer;
  17259. begin
  17260. L := Length(S);
  17261. F := 1;
  17262. while (F <= L) and C(S[F]) do
  17263. Inc(F);
  17264. G := L;
  17265. while (G >= F) and C(S[G]) do
  17266. Dec(G);
  17267. Result := CopyRangeU(S, F, G);
  17268. end;
  17269. function StrTrim(const S: String; const C: CharSet): String;
  17270. begin
  17271. {$IFDEF StringIsUnicode}
  17272. Result := StrTrimW(S, C);
  17273. {$ELSE}
  17274. Result := StrTrimA(S, C);
  17275. {$ENDIF}
  17276. end;
  17277. procedure StrTrimInPlaceA(var S : AnsiString; const C: CharSet);
  17278. begin
  17279. StrTrimLeftInPlaceA(S, C);
  17280. StrTrimRightInPlaceA(S, C);
  17281. end;
  17282. procedure StrTrimInPlaceW(var S : WideString; const C: CharSet);
  17283. begin
  17284. StrTrimLeftInPlaceW(S, C);
  17285. StrTrimRightInPlaceW(S, C);
  17286. end;
  17287. procedure StrTrimInPlaceW(var S: WideString; const C: TWideCharMatchFunction);
  17288. begin
  17289. StrTrimLeftInPlaceW(S, C);
  17290. StrTrimRightInPlaceW(S, C);
  17291. end;
  17292. procedure StrTrimInPlaceU(var S : UnicodeString; const C: CharSet);
  17293. begin
  17294. StrTrimLeftInPlaceU(S, C);
  17295. StrTrimRightInPlaceU(S, C);
  17296. end;
  17297. procedure StrTrimInPlaceU(var S: UnicodeString; const C: TWideCharMatchFunction);
  17298. begin
  17299. StrTrimLeftInPlaceU(S, C);
  17300. StrTrimRightInPlaceU(S, C);
  17301. end;
  17302. procedure StrTrimInPlace(var S : String; const C: CharSet);
  17303. begin
  17304. StrTrimLeftInPlace(S, C);
  17305. StrTrimRightInPlace(S, C);
  17306. end;
  17307. procedure TrimStringsA(var S : AnsiStringArray; const C: CharSet);
  17308. var I : Integer;
  17309. begin
  17310. for I := 0 to Length(S) - 1 do
  17311. StrTrimInPlaceA(S[I], C);
  17312. end;
  17313. procedure TrimStringsW(var S : WideStringArray; const C: CharSet);
  17314. var I : Integer;
  17315. begin
  17316. for I := 0 to Length(S) - 1 do
  17317. StrTrimInPlaceW(S[I], C);
  17318. end;
  17319. { }
  17320. { Dup }
  17321. { }
  17322. {$IFNDEF ManagedCode}
  17323. function BufToStrA(const Buf; const BufSize: Integer): AnsiString;
  17324. begin
  17325. if BufSize <= 0 then
  17326. Result := ''
  17327. else
  17328. begin
  17329. SetLength(Result, BufSize);
  17330. MoveMem(Buf, Pointer(Result)^, BufSize);
  17331. end;
  17332. end;
  17333. function BufToStrW(const Buf; const BufSize: Integer): WideString;
  17334. var L : Integer;
  17335. begin
  17336. if BufSize <= 0 then
  17337. Result := ''
  17338. else
  17339. begin
  17340. L := (BufSize + 1) div SizeOf(WideChar);
  17341. SetLength(Result, L);
  17342. MoveMem(Buf, Pointer(Result)^, BufSize);
  17343. end;
  17344. end;
  17345. function BufToStrU(const Buf; const BufSize: Integer): UnicodeString;
  17346. var L : Integer;
  17347. begin
  17348. if BufSize <= 0 then
  17349. Result := ''
  17350. else
  17351. begin
  17352. L := (BufSize + 1) div SizeOf(WideChar);
  17353. SetLength(Result, L);
  17354. MoveMem(Buf, Pointer(Result)^, BufSize);
  17355. end;
  17356. end;
  17357. function BufToStr(const Buf; const BufSize: Integer): String;
  17358. var L : Integer;
  17359. begin
  17360. if BufSize <= 0 then
  17361. Result := ''
  17362. else
  17363. begin
  17364. {$IFDEF StringIsUnicode}
  17365. L := (BufSize + 1) div SizeOf(Char);
  17366. {$ELSE}
  17367. L := BufSize;
  17368. {$ENDIF}
  17369. SetLength(Result, L);
  17370. MoveMem(Buf, Pointer(Result)^, BufSize);
  17371. end;
  17372. end;
  17373. function DupBufA(const Buf; const BufSize: Integer; const Count: Integer): AnsiString;
  17374. var P : PAnsiChar;
  17375. I : Integer;
  17376. begin
  17377. if (Count <= 0) or (BufSize <= 0) then
  17378. Result := ''
  17379. else
  17380. begin
  17381. SetLength(Result, Count * BufSize);
  17382. P := Pointer(Result);
  17383. for I := 1 to Count do
  17384. begin
  17385. MoveMem(Buf, P^, BufSize);
  17386. Inc(P, BufSize);
  17387. end;
  17388. end;
  17389. end;
  17390. function DupBufW(const Buf; const BufSize: Integer; const Count: Integer): WideString;
  17391. var P : PWideChar;
  17392. I, L : Integer;
  17393. begin
  17394. if (Count <= 0) or (BufSize <= 0) then
  17395. Result := ''
  17396. else
  17397. begin
  17398. Assert(BufSize mod SizeOf(WideChar) = 0);
  17399. L := BufSize div SizeOf(WideChar);
  17400. SetLength(Result, Count * L);
  17401. P := Pointer(Result);
  17402. for I := 1 to Count do
  17403. begin
  17404. MoveMem(Buf, P^, BufSize);
  17405. Inc(P, L);
  17406. end;
  17407. end;
  17408. end;
  17409. function DupBufU(const Buf; const BufSize: Integer; const Count: Integer): UnicodeString;
  17410. var P : PWideChar;
  17411. I, L : Integer;
  17412. begin
  17413. if (Count <= 0) or (BufSize <= 0) then
  17414. Result := ''
  17415. else
  17416. begin
  17417. Assert(BufSize mod SizeOf(WideChar) = 0);
  17418. L := BufSize div SizeOf(WideChar);
  17419. SetLength(Result, Count * L);
  17420. P := Pointer(Result);
  17421. for I := 1 to Count do
  17422. begin
  17423. MoveMem(Buf, P^, BufSize);
  17424. Inc(P, L);
  17425. end;
  17426. end;
  17427. end;
  17428. function DupBuf(const Buf; const BufSize: Integer; const Count: Integer): String;
  17429. var P : PChar;
  17430. I, L : Integer;
  17431. begin
  17432. if (Count <= 0) or (BufSize <= 0) then
  17433. Result := ''
  17434. else
  17435. begin
  17436. {$IFDEF StringIsUnicode}
  17437. Assert(BufSize mod SizeOf(Char) = 0);
  17438. L := BufSize div SizeOf(WideChar);
  17439. {$ELSE}
  17440. L := BufSize;
  17441. {$ENDIF}
  17442. SetLength(Result, Count * L);
  17443. P := Pointer(Result);
  17444. for I := 1 to Count do
  17445. begin
  17446. MoveMem(Buf, P^, BufSize);
  17447. Inc(P, L);
  17448. end;
  17449. end;
  17450. end;
  17451. {$ENDIF}
  17452. {$IFDEF CLR}
  17453. function DupStrA(const S: AnsiString; const Count: Integer): AnsiString;
  17454. var L, I, J : Integer;
  17455. begin
  17456. L := Length(S);
  17457. if L = 0 then
  17458. Result := ''
  17459. else
  17460. begin
  17461. SetLength(Result, Count * L);
  17462. for I := 0 to Count - 1 do
  17463. for J := 1 to L do
  17464. Result[I * L + J] := S[J];
  17465. end;
  17466. end;
  17467. {$ELSE}
  17468. function DupStrA(const S: AnsiString; const Count: Integer): AnsiString;
  17469. var L : Integer;
  17470. begin
  17471. L := Length(S);
  17472. if L = 0 then
  17473. Result := ''
  17474. else
  17475. Result := DupBufA(Pointer(S)^, L, Count);
  17476. end;
  17477. function DupStrW(const S: WideString; const Count: Integer): WideString;
  17478. var L : Integer;
  17479. begin
  17480. L := Length(S);
  17481. if L = 0 then
  17482. Result := ''
  17483. else
  17484. Result := DupBufW(Pointer(S)^, L * SizeOf(WideChar), Count);
  17485. end;
  17486. function DupStrU(const S: UnicodeString; const Count: Integer): UnicodeString;
  17487. var L : Integer;
  17488. begin
  17489. L := Length(S);
  17490. if L = 0 then
  17491. Result := ''
  17492. else
  17493. Result := DupBufU(Pointer(S)^, L * SizeOf(WideChar), Count);
  17494. end;
  17495. function DupStr(const S: String; const Count: Integer): String;
  17496. var L : Integer;
  17497. begin
  17498. L := Length(S);
  17499. if L = 0 then
  17500. Result := ''
  17501. else
  17502. Result := DupBuf(Pointer(S)^, L * SizeOf(Char), Count);
  17503. end;
  17504. {$ENDIF}
  17505. {$IFDEF CLR}
  17506. function DupChar(const Ch: AnsiChar; const Count: Integer): AnsiString;
  17507. var I : Integer;
  17508. begin
  17509. if Count <= 0 then
  17510. begin
  17511. Result := '';
  17512. exit;
  17513. end;
  17514. SetLength(Result, Count);
  17515. for I := 1 to Count do
  17516. Result[I] := Ch;
  17517. end;
  17518. {$ELSE}
  17519. function DupCharA(const Ch: AnsiChar; const Count: Integer): AnsiString;
  17520. begin
  17521. if Count <= 0 then
  17522. begin
  17523. Result := '';
  17524. exit;
  17525. end;
  17526. SetLength(Result, Count);
  17527. FillMem(Pointer(Result)^, Count, Ord(Ch));
  17528. end;
  17529. {$ENDIF}
  17530. function DupCharW(const Ch: WideChar; const Count: Integer): WideString;
  17531. var I : Integer;
  17532. begin
  17533. if Count <= 0 then
  17534. begin
  17535. Result := '';
  17536. exit;
  17537. end;
  17538. SetLength(Result, Count);
  17539. for I := 1 to Count do
  17540. Result[I] := Ch;
  17541. end;
  17542. function DupCharU(const Ch: WideChar; const Count: Integer): UnicodeString;
  17543. var I : Integer;
  17544. begin
  17545. if Count <= 0 then
  17546. begin
  17547. Result := '';
  17548. exit;
  17549. end;
  17550. SetLength(Result, Count);
  17551. for I := 1 to Count do
  17552. Result[I] := Ch;
  17553. end;
  17554. function DupChar(const Ch: Char; const Count: Integer): String;
  17555. var I : Integer;
  17556. begin
  17557. if Count <= 0 then
  17558. begin
  17559. Result := '';
  17560. exit;
  17561. end;
  17562. SetLength(Result, Count);
  17563. for I := 1 to Count do
  17564. Result[I] := Ch;
  17565. end;
  17566. function DupSpaceA(const Count: Integer): AnsiString;
  17567. begin
  17568. Result := DupCharA(AsciiSP, Count);
  17569. end;
  17570. function DupSpaceW(const Count: Integer): WideString;
  17571. begin
  17572. Result := DupCharW(WideSP, Count);
  17573. end;
  17574. function DupSpaceU(const Count: Integer): UnicodeString;
  17575. begin
  17576. Result := DupCharU(WideSP, Count);
  17577. end;
  17578. function DupSpace(const Count: Integer): String;
  17579. begin
  17580. Result := DupChar(' ', Count);
  17581. end;
  17582. { }
  17583. { Pad }
  17584. { }
  17585. {$IFDEF CLR}
  17586. function StrPadLeftA(const S: AnsiString; const PadChar: AnsiChar;
  17587. const Len: Integer; const Cut: Boolean): AnsiString;
  17588. var L, P, M, I : Integer;
  17589. begin
  17590. if Len = 0 then
  17591. begin
  17592. if Cut then
  17593. Result := ''
  17594. else
  17595. Result := S;
  17596. exit;
  17597. end;
  17598. M := Length(S);
  17599. if Len = M then
  17600. begin
  17601. Result := S;
  17602. exit;
  17603. end;
  17604. if Cut then
  17605. L := Len
  17606. else
  17607. L := MaxI(Len, M);
  17608. P := L - M;
  17609. if P < 0 then
  17610. P := 0;
  17611. SetLength(Result, L);
  17612. for I := 1 to P do
  17613. Result[I] := PadChar;
  17614. if L > P then
  17615. for I := 1 to L - P do
  17616. Result[P + I] := S[I];
  17617. end;
  17618. {$ELSE}
  17619. function StrPadLeftA(const S: AnsiString; const PadChar: AnsiChar;
  17620. const Len: Integer; const Cut: Boolean): AnsiString;
  17621. var F, L, P, M : Integer;
  17622. I, J : PAnsiChar;
  17623. begin
  17624. if Len = 0 then
  17625. begin
  17626. if Cut then
  17627. Result := ''
  17628. else
  17629. Result := S;
  17630. exit;
  17631. end;
  17632. M := Length(S);
  17633. if Len = M then
  17634. begin
  17635. Result := S;
  17636. exit;
  17637. end;
  17638. if Cut then
  17639. L := Len
  17640. else
  17641. L := MaxI(Len, M);
  17642. P := L - M;
  17643. if P < 0 then
  17644. P := 0;
  17645. SetLength(Result, L);
  17646. if P > 0 then
  17647. FillMem(Pointer(Result)^, P, Ord(PadChar));
  17648. if L > P then
  17649. begin
  17650. I := Pointer(Result);
  17651. J := Pointer(S);
  17652. Inc(I, P);
  17653. for F := 1 to L - P do
  17654. begin
  17655. I^ := J^;
  17656. Inc(I);
  17657. Inc(J);
  17658. end;
  17659. end;
  17660. end;
  17661. function StrPadLeftW(const S: WideString; const PadChar: WideChar;
  17662. const Len: Integer; const Cut: Boolean): WideString;
  17663. var F, L, P, M : Integer;
  17664. I, J : PWideChar;
  17665. begin
  17666. if Len = 0 then
  17667. begin
  17668. if Cut then
  17669. Result := ''
  17670. else
  17671. Result := S;
  17672. exit;
  17673. end;
  17674. M := Length(S);
  17675. if Len = M then
  17676. begin
  17677. Result := S;
  17678. exit;
  17679. end;
  17680. if Cut then
  17681. L := Len
  17682. else
  17683. L := MaxI(Len, M);
  17684. P := L - M;
  17685. if P < 0 then
  17686. P := 0;
  17687. SetLength(Result, L);
  17688. for F := 1 to P do
  17689. Result[F] := PadChar;
  17690. if L > P then
  17691. begin
  17692. I := Pointer(Result);
  17693. J := Pointer(S);
  17694. Inc(I, P);
  17695. for F := 1 to L - P do
  17696. begin
  17697. I^ := J^;
  17698. Inc(I);
  17699. Inc(J);
  17700. end;
  17701. end;
  17702. end;
  17703. function StrPadLeftU(const S: UnicodeString; const PadChar: WideChar;
  17704. const Len: Integer; const Cut: Boolean): UnicodeString;
  17705. var F, L, P, M : Integer;
  17706. I, J : PWideChar;
  17707. begin
  17708. if Len = 0 then
  17709. begin
  17710. if Cut then
  17711. Result := ''
  17712. else
  17713. Result := S;
  17714. exit;
  17715. end;
  17716. M := Length(S);
  17717. if Len = M then
  17718. begin
  17719. Result := S;
  17720. exit;
  17721. end;
  17722. if Cut then
  17723. L := Len
  17724. else
  17725. L := MaxI(Len, M);
  17726. P := L - M;
  17727. if P < 0 then
  17728. P := 0;
  17729. SetLength(Result, L);
  17730. for F := 1 to P do
  17731. Result[F] := PadChar;
  17732. if L > P then
  17733. begin
  17734. I := Pointer(Result);
  17735. J := Pointer(S);
  17736. Inc(I, P);
  17737. for F := 1 to L - P do
  17738. begin
  17739. I^ := J^;
  17740. Inc(I);
  17741. Inc(J);
  17742. end;
  17743. end;
  17744. end;
  17745. function StrPadLeft(const S: String; const PadChar: Char;
  17746. const Len: Integer; const Cut: Boolean): String;
  17747. var F, L, P, M : Integer;
  17748. I, J : PChar;
  17749. begin
  17750. if Len = 0 then
  17751. begin
  17752. if Cut then
  17753. Result := ''
  17754. else
  17755. Result := S;
  17756. exit;
  17757. end;
  17758. M := Length(S);
  17759. if Len = M then
  17760. begin
  17761. Result := S;
  17762. exit;
  17763. end;
  17764. if Cut then
  17765. L := Len
  17766. else
  17767. L := MaxI(Len, M);
  17768. P := L - M;
  17769. if P < 0 then
  17770. P := 0;
  17771. SetLength(Result, L);
  17772. for F := 1 to P do
  17773. Result[F] := PadChar;
  17774. if L > P then
  17775. begin
  17776. I := Pointer(Result);
  17777. J := Pointer(S);
  17778. Inc(I, P);
  17779. for F := 1 to L - P do
  17780. begin
  17781. I^ := J^;
  17782. Inc(I);
  17783. Inc(J);
  17784. end;
  17785. end;
  17786. end;
  17787. {$ENDIF}
  17788. {$IFDEF CLR}
  17789. function StrPadRightA(const S: AnsiString; const PadChar: AnsiChar;
  17790. const Len: Integer; const Cut: Boolean): AnsiString;
  17791. var L, P, M, I : Integer;
  17792. begin
  17793. if Len = 0 then
  17794. begin
  17795. if Cut then
  17796. Result := ''
  17797. else
  17798. Result := S;
  17799. exit;
  17800. end;
  17801. M := Length(S);
  17802. if Len = M then
  17803. begin
  17804. Result := S;
  17805. exit;
  17806. end;
  17807. if Cut then
  17808. L := Len
  17809. else
  17810. L := MaxI(Len, M);
  17811. P := L - M;
  17812. if P < 0 then
  17813. P := 0;
  17814. SetLength(Result, L);
  17815. if L > P then
  17816. for I := 1 to L - P do
  17817. Result[I] := S[I];
  17818. if P > 0 then
  17819. for I := 1 to P do
  17820. Result[L - P + I] := PadChar;
  17821. end;
  17822. {$ELSE}
  17823. function StrPadRightA(const S: AnsiString; const PadChar: AnsiChar;
  17824. const Len: Integer; const Cut: Boolean): AnsiString;
  17825. var F, L, P, M : Integer;
  17826. I, J : PAnsiChar;
  17827. begin
  17828. if Len = 0 then
  17829. begin
  17830. if Cut then
  17831. Result := ''
  17832. else
  17833. Result := S;
  17834. exit;
  17835. end;
  17836. M := Length(S);
  17837. if Len = M then
  17838. begin
  17839. Result := S;
  17840. exit;
  17841. end;
  17842. if Cut then
  17843. L := Len
  17844. else
  17845. L := MaxI(Len, M);
  17846. P := L - M;
  17847. if P < 0 then
  17848. P := 0;
  17849. SetLength(Result, L);
  17850. if L > P then
  17851. begin
  17852. I := Pointer(Result);
  17853. J := Pointer(S);
  17854. for F := 1 to L - P do
  17855. begin
  17856. I^ := J^;
  17857. Inc(I);
  17858. Inc(J);
  17859. end;
  17860. end;
  17861. if P > 0 then
  17862. FillMem(Result[L - P + 1], P, Ord(PadChar));
  17863. end;
  17864. function StrPadRightW(const S: WideString; const PadChar: WideChar;
  17865. const Len: Integer; const Cut: Boolean): WideString;
  17866. var F, L, P, M : Integer;
  17867. I, J : PWideChar;
  17868. begin
  17869. if Len = 0 then
  17870. begin
  17871. if Cut then
  17872. Result := ''
  17873. else
  17874. Result := S;
  17875. exit;
  17876. end;
  17877. M := Length(S);
  17878. if Len = M then
  17879. begin
  17880. Result := S;
  17881. exit;
  17882. end;
  17883. if Cut then
  17884. L := Len
  17885. else
  17886. L := MaxI(Len, M);
  17887. P := L - M;
  17888. if P < 0 then
  17889. P := 0;
  17890. SetLength(Result, L);
  17891. if L > P then
  17892. begin
  17893. I := Pointer(Result);
  17894. J := Pointer(S);
  17895. for F := 1 to L - P do
  17896. begin
  17897. I^ := J^;
  17898. Inc(I);
  17899. Inc(J);
  17900. end;
  17901. end;
  17902. for F := L - P + 1 to L do
  17903. Result[F] := PadChar;
  17904. end;
  17905. function StrPadRightU(const S: UnicodeString; const PadChar: WideChar;
  17906. const Len: Integer; const Cut: Boolean): UnicodeString;
  17907. var F, L, P, M : Integer;
  17908. I, J : PWideChar;
  17909. begin
  17910. if Len = 0 then
  17911. begin
  17912. if Cut then
  17913. Result := ''
  17914. else
  17915. Result := S;
  17916. exit;
  17917. end;
  17918. M := Length(S);
  17919. if Len = M then
  17920. begin
  17921. Result := S;
  17922. exit;
  17923. end;
  17924. if Cut then
  17925. L := Len
  17926. else
  17927. L := MaxI(Len, M);
  17928. P := L - M;
  17929. if P < 0 then
  17930. P := 0;
  17931. SetLength(Result, L);
  17932. if L > P then
  17933. begin
  17934. I := Pointer(Result);
  17935. J := Pointer(S);
  17936. for F := 1 to L - P do
  17937. begin
  17938. I^ := J^;
  17939. Inc(I);
  17940. Inc(J);
  17941. end;
  17942. end;
  17943. for F := L - P + 1 to L do
  17944. Result[F] := PadChar;
  17945. end;
  17946. function StrPadRight(const S: String; const PadChar: Char;
  17947. const Len: Integer; const Cut: Boolean): String;
  17948. var F, L, P, M : Integer;
  17949. I, J : PChar;
  17950. begin
  17951. if Len = 0 then
  17952. begin
  17953. if Cut then
  17954. Result := ''
  17955. else
  17956. Result := S;
  17957. exit;
  17958. end;
  17959. M := Length(S);
  17960. if Len = M then
  17961. begin
  17962. Result := S;
  17963. exit;
  17964. end;
  17965. if Cut then
  17966. L := Len
  17967. else
  17968. L := MaxI(Len, M);
  17969. P := L - M;
  17970. if P < 0 then
  17971. P := 0;
  17972. SetLength(Result, L);
  17973. if L > P then
  17974. begin
  17975. I := Pointer(Result);
  17976. J := Pointer(S);
  17977. for F := 1 to L - P do
  17978. begin
  17979. I^ := J^;
  17980. Inc(I);
  17981. Inc(J);
  17982. end;
  17983. end;
  17984. for F := L - P + 1 to L do
  17985. Result[F] := PadChar;
  17986. end;
  17987. {$ENDIF}
  17988. function StrPadA(const S: AnsiString; const PadChar: AnsiChar; const Len: Integer;
  17989. const Cut: Boolean): AnsiString;
  17990. var I : Integer;
  17991. begin
  17992. I := Len - Length(S);
  17993. Result := DupCharA(PadChar, I div 2) + S + DupCharA(PadChar, (I + 1) div 2);
  17994. if Cut then
  17995. SetLength(Result, Len);
  17996. end;
  17997. function StrPadW(const S: WideString; const PadChar: WideChar; const Len: Integer;
  17998. const Cut: Boolean): WideString;
  17999. var I : Integer;
  18000. begin
  18001. I := Len - Length(S);
  18002. Result := DupCharW(PadChar, I div 2) + S + DupCharW(PadChar, (I + 1) div 2);
  18003. if Cut then
  18004. SetLength(Result, Len);
  18005. end;
  18006. function StrPadU(const S: UnicodeString; const PadChar: WideChar; const Len: Integer;
  18007. const Cut: Boolean): UnicodeString;
  18008. var I : Integer;
  18009. begin
  18010. I := Len - Length(S);
  18011. Result := DupCharU(PadChar, I div 2) + S + DupCharU(PadChar, (I + 1) div 2);
  18012. if Cut then
  18013. SetLength(Result, Len);
  18014. end;
  18015. function StrPad(const S: String; const PadChar: Char; const Len: Integer;
  18016. const Cut: Boolean): String;
  18017. var I : Integer;
  18018. begin
  18019. I := Len - Length(S);
  18020. Result := DupChar(PadChar, I div 2) + S + DupChar(PadChar, (I + 1) div 2);
  18021. if Cut then
  18022. SetLength(Result, Len);
  18023. end;
  18024. { }
  18025. { Delimited }
  18026. { }
  18027. function StrBetweenCharA(const S: AnsiString;
  18028. const FirstDelim, SecondDelim: AnsiChar;
  18029. const FirstOptional: Boolean; const SecondOptional: Boolean): AnsiString;
  18030. var I, J : Integer;
  18031. begin
  18032. Result := '';
  18033. I := PosCharA(FirstDelim, S);
  18034. if (I = 0) and not FirstOptional then
  18035. exit;
  18036. J := PosCharA(SecondDelim, S, I + 1);
  18037. if J = 0 then
  18038. if not SecondOptional then
  18039. exit
  18040. else
  18041. J := Length(S) + 1;
  18042. Result := CopyRangeA(S, I + 1, J - 1);
  18043. end;
  18044. function StrBetweenCharA(const S: AnsiString;
  18045. const FirstDelim, SecondDelim: CharSet;
  18046. const FirstOptional: Boolean; const SecondOptional: Boolean): AnsiString;
  18047. var I, J : Integer;
  18048. begin
  18049. Result := '';
  18050. I := PosCharSetA(FirstDelim, S);
  18051. if (I = 0) and not FirstOptional then
  18052. exit;
  18053. J := PosCharSetA(SecondDelim, S, I + 1);
  18054. if J = 0 then
  18055. if not SecondOptional then
  18056. exit
  18057. else
  18058. J := Length(S) + 1;
  18059. Result := CopyRangeA(S, I + 1, J - 1);
  18060. end;
  18061. function StrBetweenCharW(const S: WideString;
  18062. const FirstDelim, SecondDelim: WideChar;
  18063. const FirstOptional: Boolean; const SecondOptional: Boolean): WideString;
  18064. var I, J : Integer;
  18065. begin
  18066. Result := '';
  18067. I := PosCharW(FirstDelim, S);
  18068. if (I = 0) and not FirstOptional then
  18069. exit;
  18070. J := PosCharW(SecondDelim, S, I + 1);
  18071. if J = 0 then
  18072. if not SecondOptional then
  18073. exit
  18074. else
  18075. J := Length(S) + 1;
  18076. Result := CopyRangeW(S, I + 1, J - 1);
  18077. end;
  18078. function StrBetweenCharW(const S: WideString;
  18079. const FirstDelim, SecondDelim: CharSet;
  18080. const FirstOptional: Boolean; const SecondOptional: Boolean): WideString;
  18081. var I, J : Integer;
  18082. begin
  18083. Result := '';
  18084. I := PosCharSetW(FirstDelim, S);
  18085. if (I = 0) and not FirstOptional then
  18086. exit;
  18087. J := PosCharSetW(SecondDelim, S, I + 1);
  18088. if J = 0 then
  18089. if not SecondOptional then
  18090. exit
  18091. else
  18092. J := Length(S) + 1;
  18093. Result := CopyRangeW(S, I + 1, J - 1);
  18094. end;
  18095. function StrBetweenChar(const S: String;
  18096. const FirstDelim, SecondDelim: Char;
  18097. const FirstOptional: Boolean; const SecondOptional: Boolean): String;
  18098. var I, J : Integer;
  18099. begin
  18100. Result := '';
  18101. I := PosChar(FirstDelim, S);
  18102. if (I = 0) and not FirstOptional then
  18103. exit;
  18104. J := PosChar(SecondDelim, S, I + 1);
  18105. if J = 0 then
  18106. if not SecondOptional then
  18107. exit
  18108. else
  18109. J := Length(S) + 1;
  18110. Result := CopyRange(S, I + 1, J - 1);
  18111. end;
  18112. function StrBetweenChar(const S: String;
  18113. const FirstDelim, SecondDelim: CharSet;
  18114. const FirstOptional: Boolean; const SecondOptional: Boolean): String;
  18115. var I, J : Integer;
  18116. begin
  18117. Result := '';
  18118. I := PosCharSet(FirstDelim, S);
  18119. if (I = 0) and not FirstOptional then
  18120. exit;
  18121. J := PosCharSet(SecondDelim, S, I + 1);
  18122. if J = 0 then
  18123. if not SecondOptional then
  18124. exit
  18125. else
  18126. J := Length(S) + 1;
  18127. Result := CopyRange(S, I + 1, J - 1);
  18128. end;
  18129. function StrBetweenA(const S: AnsiString; const FirstDelim: AnsiString;
  18130. const SecondDelim: CharSet; const FirstOptional: Boolean;
  18131. const SecondOptional: Boolean;
  18132. const FirstDelimAsciiCaseSensitive: Boolean): AnsiString;
  18133. var I, J : Integer;
  18134. begin
  18135. Result := '';
  18136. I := PosStrA(FirstDelim, S, 1, FirstDelimAsciiCaseSensitive);
  18137. if (I = 0) and not FirstOptional then
  18138. exit;
  18139. Inc(I, Length(FirstDelim));
  18140. J := PosCharSetA(SecondDelim, S, I);
  18141. if J = 0 then
  18142. if not SecondOptional then
  18143. exit
  18144. else
  18145. J := Length(S) + 1;
  18146. Result := CopyRangeA(S, I, J - 1);
  18147. end;
  18148. function StrBetweenA(const S: AnsiString;
  18149. const FirstDelim, SecondDelim: AnsiString; const FirstOptional: Boolean;
  18150. const SecondOptional: Boolean ; const FirstDelimAsciiCaseSensitive: Boolean;
  18151. const SecondDelimAsciiCaseSensitive: Boolean): AnsiString;
  18152. var I, J : Integer;
  18153. begin
  18154. Result := '';
  18155. I := PosStrA(FirstDelim, S, 1, FirstDelimAsciiCaseSensitive);
  18156. if (I = 0) and not FirstOptional then
  18157. exit;
  18158. Inc(I, Length(FirstDelim));
  18159. J := PosStrA(SecondDelim, S, I, SecondDelimAsciiCaseSensitive);
  18160. if J = 0 then
  18161. if not SecondOptional then
  18162. exit
  18163. else
  18164. J := Length(S) + 1;
  18165. Result := CopyRangeA(S, I, J - 1);
  18166. end;
  18167. function StrBetweenW(const S: WideString; const FirstDelim: WideString;
  18168. const SecondDelim: CharSet; const FirstOptional: Boolean;
  18169. const SecondOptional: Boolean;
  18170. const FirstDelimAsciiCaseSensitive: Boolean): WideString;
  18171. var I, J : Integer;
  18172. begin
  18173. Result := '';
  18174. I := PosStrW(FirstDelim, S, 1, FirstDelimAsciiCaseSensitive);
  18175. if (I = 0) and not FirstOptional then
  18176. exit;
  18177. Inc(I, Length(FirstDelim));
  18178. J := PosCharSetW(SecondDelim, S, I);
  18179. if J = 0 then
  18180. if not SecondOptional then
  18181. exit
  18182. else
  18183. J := Length(S) + 1;
  18184. Result := CopyRangeW(S, I, J - 1);
  18185. end;
  18186. function StrBetweenW(const S: WideString;
  18187. const FirstDelim, SecondDelim: WideString; const FirstOptional: Boolean;
  18188. const SecondOptional: Boolean ; const FirstDelimAsciiCaseSensitive: Boolean;
  18189. const SecondDelimAsciiCaseSensitive: Boolean): WideString;
  18190. var I, J : Integer;
  18191. begin
  18192. Result := '';
  18193. I := PosStrW(FirstDelim, S, 1, FirstDelimAsciiCaseSensitive);
  18194. if (I = 0) and not FirstOptional then
  18195. exit;
  18196. Inc(I, Length(FirstDelim));
  18197. J := PosStrW(SecondDelim, S, I, SecondDelimAsciiCaseSensitive);
  18198. if J = 0 then
  18199. if not SecondOptional then
  18200. exit
  18201. else
  18202. J := Length(S) + 1;
  18203. Result := CopyRangeW(S, I, J - 1);
  18204. end;
  18205. function StrBetween(const S: String; const FirstDelim: String;
  18206. const SecondDelim: CharSet; const FirstOptional: Boolean;
  18207. const SecondOptional: Boolean;
  18208. const FirstDelimAsciiCaseSensitive: Boolean): String;
  18209. var I, J : Integer;
  18210. begin
  18211. Result := '';
  18212. I := PosStr(FirstDelim, S, 1, FirstDelimAsciiCaseSensitive);
  18213. if (I = 0) and not FirstOptional then
  18214. exit;
  18215. Inc(I, Length(FirstDelim));
  18216. J := PosCharSet(SecondDelim, S, I);
  18217. if J = 0 then
  18218. if not SecondOptional then
  18219. exit
  18220. else
  18221. J := Length(S) + 1;
  18222. Result := CopyRange(S, I, J - 1);
  18223. end;
  18224. function StrBetween(const S: String;
  18225. const FirstDelim, SecondDelim: String; const FirstOptional: Boolean;
  18226. const SecondOptional: Boolean ; const FirstDelimAsciiCaseSensitive: Boolean;
  18227. const SecondDelimAsciiCaseSensitive: Boolean): String;
  18228. var I, J : Integer;
  18229. begin
  18230. Result := '';
  18231. I := PosStr(FirstDelim, S, 1, FirstDelimAsciiCaseSensitive);
  18232. if (I = 0) and not FirstOptional then
  18233. exit;
  18234. Inc(I, Length(FirstDelim));
  18235. J := PosStr(SecondDelim, S, I, SecondDelimAsciiCaseSensitive);
  18236. if J = 0 then
  18237. if not SecondOptional then
  18238. exit
  18239. else
  18240. J := Length(S) + 1;
  18241. Result := CopyRange(S, I, J - 1);
  18242. end;
  18243. function StrBeforeA(const S, D: AnsiString; const Optional: Boolean;
  18244. const AsciiCaseSensitive: Boolean): AnsiString;
  18245. var I : Integer;
  18246. begin
  18247. I := PosStrA(D, S, 1, AsciiCaseSensitive);
  18248. if I = 0 then
  18249. if Optional then
  18250. Result := S
  18251. else
  18252. Result := ''
  18253. else
  18254. Result := CopyLeftA(S, I - 1);
  18255. end;
  18256. function StrBeforeRevA(const S, D: AnsiString; const Optional: Boolean;
  18257. const AsciiCaseSensitive: Boolean): AnsiString;
  18258. var I : Integer;
  18259. begin
  18260. I := PosStrRevA(D, S, 1, AsciiCaseSensitive);
  18261. if I = 0 then
  18262. if Optional then
  18263. Result := S
  18264. else
  18265. Result := ''
  18266. else
  18267. Result := CopyLeftA(S, I - 1);
  18268. end;
  18269. function StrBeforeW(const S, D: WideString; const Optional: Boolean;
  18270. const AsciiCaseSensitive: Boolean): WideString;
  18271. var I : Integer;
  18272. begin
  18273. I := PosStrW(D, S, 1, AsciiCaseSensitive);
  18274. if I = 0 then
  18275. if Optional then
  18276. Result := S
  18277. else
  18278. Result := ''
  18279. else
  18280. Result := CopyLeftW(S, I - 1);
  18281. end;
  18282. function StrBeforeRevW(const S, D: WideString; const Optional: Boolean;
  18283. const AsciiCaseSensitive: Boolean): WideString;
  18284. var I : Integer;
  18285. begin
  18286. I := PosStrRevW(D, S, 1, AsciiCaseSensitive);
  18287. if I = 0 then
  18288. if Optional then
  18289. Result := S
  18290. else
  18291. Result := ''
  18292. else
  18293. Result := CopyLeftW(S, I - 1);
  18294. end;
  18295. function StrBefore(const S, D: String; const Optional: Boolean;
  18296. const AsciiCaseSensitive: Boolean): String;
  18297. var I : Integer;
  18298. begin
  18299. I := PosStr(D, S, 1, AsciiCaseSensitive);
  18300. if I = 0 then
  18301. if Optional then
  18302. Result := S
  18303. else
  18304. Result := ''
  18305. else
  18306. Result := CopyLeft(S, I - 1);
  18307. end;
  18308. function StrBeforeRev(const S, D: String; const Optional: Boolean;
  18309. const AsciiCaseSensitive: Boolean): String;
  18310. var I : Integer;
  18311. begin
  18312. I := PosStrRev(D, S, 1, AsciiCaseSensitive);
  18313. if I = 0 then
  18314. if Optional then
  18315. Result := S
  18316. else
  18317. Result := ''
  18318. else
  18319. Result := CopyLeft(S, I - 1);
  18320. end;
  18321. function StrBeforeCharA(const S: AnsiString; const D: CharSet;
  18322. const Optional: Boolean): AnsiString;
  18323. var I : Integer;
  18324. begin
  18325. I := PosCharSetA(D, S);
  18326. if I = 0 then
  18327. if Optional then
  18328. Result := S
  18329. else
  18330. Result := ''
  18331. else
  18332. Result := CopyLeftA(S, I - 1);
  18333. end;
  18334. function StrBeforeCharA(const S: AnsiString; const D: AnsiChar;
  18335. const Optional: Boolean): AnsiString;
  18336. var I : Integer;
  18337. begin
  18338. I := PosCharA(D, S);
  18339. if I = 0 then
  18340. if Optional then
  18341. Result := S
  18342. else
  18343. Result := ''
  18344. else
  18345. Result := CopyLeftA(S, I - 1);
  18346. end;
  18347. function StrBeforeCharRevA(const S: AnsiString; const D: CharSet;
  18348. const Optional: Boolean): AnsiString;
  18349. var I : Integer;
  18350. begin
  18351. I := PosCharSetRevA(D, S);
  18352. if I = 0 then
  18353. if Optional then
  18354. Result := S
  18355. else
  18356. Result := ''
  18357. else
  18358. Result := CopyLeftA(S, I - 1);
  18359. end;
  18360. function StrBeforeCharW(const S: WideString; const D: CharSet;
  18361. const Optional: Boolean): WideString;
  18362. var I : Integer;
  18363. begin
  18364. I := PosCharSetW(D, S);
  18365. if I = 0 then
  18366. if Optional then
  18367. Result := S
  18368. else
  18369. Result := ''
  18370. else
  18371. Result := CopyLeftW(S, I - 1);
  18372. end;
  18373. function StrBeforeCharW(const S: WideString; const D: WideChar;
  18374. const Optional: Boolean): WideString;
  18375. var I : Integer;
  18376. begin
  18377. I := PosCharW(D, S);
  18378. if I = 0 then
  18379. if Optional then
  18380. Result := S
  18381. else
  18382. Result := ''
  18383. else
  18384. Result := CopyLeftW(S, I - 1);
  18385. end;
  18386. function StrBeforeCharRevW(const S: WideString; const D: CharSet;
  18387. const Optional: Boolean): WideString;
  18388. var I : Integer;
  18389. begin
  18390. I := PosCharSetRevW(D, S);
  18391. if I = 0 then
  18392. if Optional then
  18393. Result := S
  18394. else
  18395. Result := ''
  18396. else
  18397. Result := CopyLeftW(S, I - 1);
  18398. end;
  18399. function StrBeforeChar(const S: String; const D: CharSet;
  18400. const Optional: Boolean): String;
  18401. var I : Integer;
  18402. begin
  18403. I := PosCharSet(D, S);
  18404. if I = 0 then
  18405. if Optional then
  18406. Result := S
  18407. else
  18408. Result := ''
  18409. else
  18410. Result := CopyLeft(S, I - 1);
  18411. end;
  18412. function StrBeforeChar(const S: String; const D: Char;
  18413. const Optional: Boolean): String;
  18414. var I : Integer;
  18415. begin
  18416. I := PosChar(D, S);
  18417. if I = 0 then
  18418. if Optional then
  18419. Result := S
  18420. else
  18421. Result := ''
  18422. else
  18423. Result := CopyLeft(S, I - 1);
  18424. end;
  18425. function StrBeforeCharRev(const S: String; const D: CharSet;
  18426. const Optional: Boolean): String;
  18427. var I : Integer;
  18428. begin
  18429. I := PosCharSetRev(D, S);
  18430. if I = 0 then
  18431. if Optional then
  18432. Result := S
  18433. else
  18434. Result := ''
  18435. else
  18436. Result := CopyLeft(S, I - 1);
  18437. end;
  18438. function StrAfterA(const S, D: AnsiString; const Optional: Boolean): AnsiString;
  18439. var I : Integer;
  18440. begin
  18441. I := PosStrA(D, S);
  18442. if I = 0 then
  18443. if Optional then
  18444. Result := S
  18445. else
  18446. Result := ''
  18447. else
  18448. Result := CopyFromA(S, I + Length(D));
  18449. end;
  18450. function StrAfterRevA(const S, D: AnsiString; const Optional: Boolean): AnsiString;
  18451. var I : Integer;
  18452. begin
  18453. I := PosStrRevA(D, S);
  18454. if I = 0 then
  18455. if Optional then
  18456. Result := S
  18457. else
  18458. Result := ''
  18459. else
  18460. Result := CopyFromA(S, I + Length(D));
  18461. end;
  18462. function StrAfterW(const S, D: WideString; const Optional: Boolean): WideString;
  18463. var I : Integer;
  18464. begin
  18465. I := PosStrW(D, S);
  18466. if I = 0 then
  18467. if Optional then
  18468. Result := S
  18469. else
  18470. Result := ''
  18471. else
  18472. Result := CopyFromW(S, I + Length(D));
  18473. end;
  18474. function StrAfterRevW(const S, D: WideString; const Optional: Boolean): WideString;
  18475. var I : Integer;
  18476. begin
  18477. I := PosStrRevW(D, S);
  18478. if I = 0 then
  18479. if Optional then
  18480. Result := S
  18481. else
  18482. Result := ''
  18483. else
  18484. Result := CopyFromW(S, I + Length(D));
  18485. end;
  18486. function StrAfter(const S, D: String; const Optional: Boolean): String;
  18487. var I : Integer;
  18488. begin
  18489. I := PosStr(D, S);
  18490. if I = 0 then
  18491. if Optional then
  18492. Result := S
  18493. else
  18494. Result := ''
  18495. else
  18496. Result := CopyFrom(S, I + Length(D));
  18497. end;
  18498. function StrAfterRev(const S, D: String; const Optional: Boolean): String;
  18499. var I : Integer;
  18500. begin
  18501. I := PosStrRev(D, S);
  18502. if I = 0 then
  18503. if Optional then
  18504. Result := S
  18505. else
  18506. Result := ''
  18507. else
  18508. Result := CopyFrom(S, I + Length(D));
  18509. end;
  18510. function StrAfterCharA(const S: AnsiString; const D: CharSet): AnsiString;
  18511. var I : Integer;
  18512. begin
  18513. I := PosCharSetA(D, S);
  18514. if I = 0 then
  18515. Result := ''
  18516. else
  18517. Result := CopyFromA(S, I + 1);
  18518. end;
  18519. function StrAfterCharA(const S: AnsiString; const D: AnsiChar): AnsiString;
  18520. var I : Integer;
  18521. begin
  18522. I := PosCharA(D, S);
  18523. if I = 0 then
  18524. Result := ''
  18525. else
  18526. Result := CopyFromA(S, I + 1);
  18527. end;
  18528. function StrAfterCharW(const S: WideString; const D: CharSet): WideString;
  18529. var I : Integer;
  18530. begin
  18531. I := PosCharSetW(D, S);
  18532. if I = 0 then
  18533. Result := ''
  18534. else
  18535. Result := CopyFromW(S, I + 1);
  18536. end;
  18537. function StrAfterCharW(const S: WideString; const D: WideChar): WideString;
  18538. var I : Integer;
  18539. begin
  18540. I := PosCharW(D, S);
  18541. if I = 0 then
  18542. Result := ''
  18543. else
  18544. Result := CopyFromW(S, I + 1);
  18545. end;
  18546. function StrAfterChar(const S: String; const D: CharSet): String;
  18547. var I : Integer;
  18548. begin
  18549. I := PosCharSet(D, S);
  18550. if I = 0 then
  18551. Result := ''
  18552. else
  18553. Result := CopyFrom(S, I + 1);
  18554. end;
  18555. function StrAfterChar(const S: String; const D: Char): String;
  18556. var I : Integer;
  18557. begin
  18558. I := PosChar(D, S);
  18559. if I = 0 then
  18560. Result := ''
  18561. else
  18562. Result := CopyFrom(S, I + 1);
  18563. end;
  18564. function StrCopyToCharA(const S: AnsiString; const D: CharSet;
  18565. const Optional: Boolean): AnsiString;
  18566. var I : Integer;
  18567. begin
  18568. I := PosCharSetA(D, S);
  18569. if I = 0 then
  18570. if Optional then
  18571. Result := S
  18572. else
  18573. Result := ''
  18574. else
  18575. Result := CopyLeftA(S, I);
  18576. end;
  18577. function StrCopyToCharA(const S: AnsiString; const D: AnsiChar;
  18578. const Optional: Boolean): AnsiString;
  18579. var I : Integer;
  18580. begin
  18581. I := PosCharA(D, S);
  18582. if I = 0 then
  18583. if Optional then
  18584. Result := S
  18585. else
  18586. Result := ''
  18587. else
  18588. Result := CopyLeftA(S, I);
  18589. end;
  18590. function StrCopyToCharW(const S: WideString; const D: CharSet;
  18591. const Optional: Boolean): WideString;
  18592. var I : Integer;
  18593. begin
  18594. I := PosCharSetW(D, S);
  18595. if I = 0 then
  18596. if Optional then
  18597. Result := S
  18598. else
  18599. Result := ''
  18600. else
  18601. Result := CopyLeftW(S, I);
  18602. end;
  18603. function StrCopyToCharW(const S: WideString; const D: WideChar;
  18604. const Optional: Boolean): WideString;
  18605. var I : Integer;
  18606. begin
  18607. I := PosCharW(D, S);
  18608. if I = 0 then
  18609. if Optional then
  18610. Result := S
  18611. else
  18612. Result := ''
  18613. else
  18614. Result := CopyLeftW(S, I);
  18615. end;
  18616. function StrCopyToChar(const S: String; const D: CharSet;
  18617. const Optional: Boolean): String;
  18618. var I : Integer;
  18619. begin
  18620. I := PosCharSet(D, S);
  18621. if I = 0 then
  18622. if Optional then
  18623. Result := S
  18624. else
  18625. Result := ''
  18626. else
  18627. Result := CopyLeft(S, I);
  18628. end;
  18629. function StrCopyToChar(const S: String; const D: Char;
  18630. const Optional: Boolean): String;
  18631. var I : Integer;
  18632. begin
  18633. I := PosChar(D, S);
  18634. if I = 0 then
  18635. if Optional then
  18636. Result := S
  18637. else
  18638. Result := ''
  18639. else
  18640. Result := CopyLeft(S, I);
  18641. end;
  18642. function StrCopyFromCharA(const S: AnsiString; const D: CharSet): AnsiString;
  18643. var I : Integer;
  18644. begin
  18645. I := PosCharSetA(D, S);
  18646. if I = 0 then
  18647. Result := ''
  18648. else
  18649. Result := CopyFromA(S, I);
  18650. end;
  18651. function StrCopyFromCharA(const S: AnsiString; const D: AnsiChar): AnsiString;
  18652. var I : Integer;
  18653. begin
  18654. I := PosCharA(D, S);
  18655. if I = 0 then
  18656. Result := ''
  18657. else
  18658. Result := CopyFromA(S, I);
  18659. end;
  18660. function StrCopyFromCharW(const S: WideString; const D: CharSet): WideString;
  18661. var I : Integer;
  18662. begin
  18663. I := PosCharSetW(D, S);
  18664. if I = 0 then
  18665. Result := ''
  18666. else
  18667. Result := CopyFromW(S, I);
  18668. end;
  18669. function StrCopyFromCharW(const S: WideString; const D: WideChar): WideString;
  18670. var I : Integer;
  18671. begin
  18672. I := PosCharW(D, S);
  18673. if I = 0 then
  18674. Result := ''
  18675. else
  18676. Result := CopyFromW(S, I);
  18677. end;
  18678. function StrCopyFromChar(const S: String; const D: CharSet): String;
  18679. var I : Integer;
  18680. begin
  18681. I := PosCharSet(D, S);
  18682. if I = 0 then
  18683. Result := ''
  18684. else
  18685. Result := CopyFrom(S, I);
  18686. end;
  18687. function StrCopyFromChar(const S: String; const D: Char): String;
  18688. var I : Integer;
  18689. begin
  18690. I := PosChar(D, S);
  18691. if I = 0 then
  18692. Result := ''
  18693. else
  18694. Result := CopyFrom(S, I);
  18695. end;
  18696. function StrRemoveCharDelimitedA(var S: AnsiString;
  18697. const FirstDelim, SecondDelim: AnsiChar): AnsiString;
  18698. var I, J : Integer;
  18699. begin
  18700. Result := '';
  18701. I := PosCharA(FirstDelim, S);
  18702. if I = 0 then
  18703. exit;
  18704. J := PosCharA(SecondDelim, S, I + 1);
  18705. if J = 0 then
  18706. exit;
  18707. Result := CopyRangeA(S, I + 1, J - 1);
  18708. Delete(S, I, J - I + 1);
  18709. end;
  18710. function StrRemoveCharDelimitedW(var S: WideString;
  18711. const FirstDelim, SecondDelim: WideChar): WideString;
  18712. var I, J : Integer;
  18713. begin
  18714. Result := '';
  18715. I := PosCharW(FirstDelim, S);
  18716. if I = 0 then
  18717. exit;
  18718. J := PosCharW(SecondDelim, S, I + 1);
  18719. if J = 0 then
  18720. exit;
  18721. Result := CopyRangeW(S, I + 1, J - 1);
  18722. Delete(S, I, J - I + 1);
  18723. end;
  18724. function StrRemoveCharDelimited(var S: String;
  18725. const FirstDelim, SecondDelim: Char): String;
  18726. var I, J : Integer;
  18727. begin
  18728. Result := '';
  18729. I := PosChar(FirstDelim, S);
  18730. if I = 0 then
  18731. exit;
  18732. J := PosChar(SecondDelim, S, I + 1);
  18733. if J = 0 then
  18734. exit;
  18735. Result := CopyRange(S, I + 1, J - 1);
  18736. Delete(S, I, J - I + 1);
  18737. end;
  18738. { }
  18739. { Count }
  18740. { }
  18741. {$IFDEF CLR}
  18742. function StrCountChar(const S: AnsiString; const C: AnsiChar): Integer;
  18743. var I : Integer;
  18744. begin
  18745. Result := 0;
  18746. for I := 1 to Length(S) do
  18747. if S[I] = C then
  18748. Inc(Result);
  18749. end;
  18750. {$ELSE}
  18751. function StrCountCharA(const S: AnsiString; const C: AnsiChar): Integer;
  18752. var P : PAnsiChar;
  18753. I : Integer;
  18754. begin
  18755. Result := 0;
  18756. P := Pointer(S);
  18757. for I := 1 to Length(S) do
  18758. begin
  18759. if P^ = C then
  18760. Inc(Result);
  18761. Inc(P);
  18762. end;
  18763. end;
  18764. function StrCountCharW(const S: WideString; const C: WideChar): Integer;
  18765. var P : PWideChar;
  18766. I : Integer;
  18767. begin
  18768. Result := 0;
  18769. P := Pointer(S);
  18770. for I := 1 to Length(S) do
  18771. begin
  18772. if P^ = C then
  18773. Inc(Result);
  18774. Inc(P);
  18775. end;
  18776. end;
  18777. function StrCountCharU(const S: UnicodeString; const C: WideChar): Integer;
  18778. var P : PWideChar;
  18779. I : Integer;
  18780. begin
  18781. Result := 0;
  18782. P := Pointer(S);
  18783. for I := 1 to Length(S) do
  18784. begin
  18785. if P^ = C then
  18786. Inc(Result);
  18787. Inc(P);
  18788. end;
  18789. end;
  18790. function StrCountChar(const S: String; const C: Char): Integer;
  18791. var P : PChar;
  18792. I : Integer;
  18793. begin
  18794. Result := 0;
  18795. P := Pointer(S);
  18796. for I := 1 to Length(S) do
  18797. begin
  18798. if P^ = C then
  18799. Inc(Result);
  18800. Inc(P);
  18801. end;
  18802. end;
  18803. {$ENDIF}
  18804. {$IFDEF CLR}
  18805. function StrCountChar(const S: AnsiString; const C: CharSet): Integer;
  18806. var I : Integer;
  18807. begin
  18808. Result := 0;
  18809. for I := 1 to Length(S) do
  18810. if S[I] in C then
  18811. Inc(Result);
  18812. end;
  18813. {$ELSE}
  18814. function StrCountCharA(const S: AnsiString; const C: CharSet): Integer;
  18815. var P : PAnsiChar;
  18816. I : Integer;
  18817. begin
  18818. Result := 0;
  18819. P := Pointer(S);
  18820. for I := 1 to Length(S) do
  18821. begin
  18822. if P^ in C then
  18823. Inc(Result);
  18824. Inc(P);
  18825. end;
  18826. end;
  18827. function StrCountCharW(const S: WideString; const C: CharSet): Integer;
  18828. var P : PWideChar;
  18829. D : WideChar;
  18830. I : Integer;
  18831. begin
  18832. Result := 0;
  18833. P := Pointer(S);
  18834. for I := 1 to Length(S) do
  18835. begin
  18836. D := P^;
  18837. if WideCharInCharSet(D, C) then
  18838. Inc(Result);
  18839. Inc(P);
  18840. end;
  18841. end;
  18842. function StrCountCharU(const S: UnicodeString; const C: CharSet): Integer;
  18843. var P : PWideChar;
  18844. D : WideChar;
  18845. I : Integer;
  18846. begin
  18847. Result := 0;
  18848. P := Pointer(S);
  18849. for I := 1 to Length(S) do
  18850. begin
  18851. D := P^;
  18852. if WideCharInCharSet(D, C) then
  18853. Inc(Result);
  18854. Inc(P);
  18855. end;
  18856. end;
  18857. function StrCountChar(const S: String; const C: CharSet): Integer;
  18858. var P : PChar;
  18859. D : Char;
  18860. I : Integer;
  18861. begin
  18862. Result := 0;
  18863. P := Pointer(S);
  18864. for I := 1 to Length(S) do
  18865. begin
  18866. D := P^;
  18867. {$IFDEF StringIsUnicode}
  18868. if Ord(D) <= $FF then
  18869. {$ENDIF}
  18870. if AnsiChar(Ord(D)) in C then
  18871. Inc(Result);
  18872. Inc(P);
  18873. end;
  18874. end;
  18875. {$ENDIF}
  18876. { }
  18877. { Replace }
  18878. { }
  18879. {$IFDEF CLR}
  18880. function StrReplaceChar(const Find, Replace: AnsiChar;
  18881. const S: AnsiString): AnsiString;
  18882. var I, J : Integer;
  18883. begin
  18884. Result := S;
  18885. I := PosCharA(Find, S);
  18886. if I = 0 then
  18887. exit;
  18888. for J := I to Length(S) do
  18889. if S[J] = Find then
  18890. Result[J] := Replace;
  18891. end;
  18892. {$ELSE}
  18893. function StrReplaceCharA(const Find, Replace: AnsiChar; const S: AnsiString): AnsiString;
  18894. var P, Q : PAnsiChar;
  18895. I, J : Integer;
  18896. begin
  18897. Result := S;
  18898. I := PosCharA(Find, S);
  18899. if I = 0 then
  18900. exit;
  18901. UniqueString(Result);
  18902. Q := Pointer(Result);
  18903. Inc(Q, I - 1);
  18904. P := Pointer(S);
  18905. Inc(P, I - 1);
  18906. for J := I to Length(S) do
  18907. begin
  18908. if P^ = Find then
  18909. Q^ := Replace;
  18910. Inc(P);
  18911. Inc(Q);
  18912. end;
  18913. end;
  18914. {$ENDIF}
  18915. function StrReplaceCharW(const Find, Replace: WideChar; const S: WideString): WideString;
  18916. var I, J : Integer;
  18917. begin
  18918. Result := S;
  18919. I := PosCharW(Find, S);
  18920. if I = 0 then
  18921. exit;
  18922. for J := I to Length(S) do
  18923. if S[J] = Find then
  18924. Result[J] := Replace;
  18925. end;
  18926. function StrReplaceCharU(const Find, Replace: WideChar; const S: UnicodeString): UnicodeString;
  18927. var I, J : Integer;
  18928. begin
  18929. Result := S;
  18930. I := PosCharU(Find, S);
  18931. if I = 0 then
  18932. exit;
  18933. for J := I to Length(S) do
  18934. if S[J] = Find then
  18935. Result[J] := Replace;
  18936. end;
  18937. function StrReplaceChar(const Find, Replace: Char; const S: String): String;
  18938. var I, J : Integer;
  18939. begin
  18940. Result := S;
  18941. I := PosChar(Find, S);
  18942. if I = 0 then
  18943. exit;
  18944. for J := I to Length(S) do
  18945. if S[J] = Find then
  18946. Result[J] := Replace;
  18947. end;
  18948. {$IFDEF CLR}
  18949. function StrReplaceChar(const Find: CharSet; const Replace: AnsiChar;
  18950. const S: AnsiString): AnsiString;
  18951. var I, J : Integer;
  18952. begin
  18953. Result := S;
  18954. I := PosCharA(Find, S);
  18955. if I = 0 then
  18956. exit;
  18957. for J := I to Length(S) do
  18958. if S[J] in Find then
  18959. Result[J] := Replace;
  18960. end;
  18961. {$ELSE}
  18962. function StrReplaceCharA(const Find: CharSet; const Replace: AnsiChar;
  18963. const S: AnsiString): AnsiString;
  18964. var P, Q : PAnsiChar;
  18965. I, J : Integer;
  18966. begin
  18967. Result := S;
  18968. I := PosCharSetA(Find, S);
  18969. if I = 0 then
  18970. exit;
  18971. UniqueString(Result);
  18972. Q := Pointer(Result);
  18973. Inc(Q, I - 1);
  18974. P := Pointer(S);
  18975. Inc(P, I - 1);
  18976. for J := I to Length(S) do
  18977. begin
  18978. if P^ in Find then
  18979. Q^ := Replace;
  18980. Inc(P);
  18981. Inc(Q);
  18982. end;
  18983. end;
  18984. function StrReplaceCharW(const Find: CharSet; const Replace: WideChar;
  18985. const S: WideString): WideString;
  18986. var P, Q : PWideChar;
  18987. I, J : Integer;
  18988. C : WideChar;
  18989. begin
  18990. Result := S;
  18991. I := PosCharSetW(Find, S);
  18992. if I = 0 then
  18993. exit;
  18994. UniqueString(Result);
  18995. Q := Pointer(Result);
  18996. Inc(Q, I - 1);
  18997. P := Pointer(S);
  18998. Inc(P, I - 1);
  18999. for J := I to Length(S) do
  19000. begin
  19001. C := P^;
  19002. if Ord(C) <= $FF then
  19003. if AnsiChar(Ord(C)) in Find then
  19004. Q^ := Replace;
  19005. Inc(P);
  19006. Inc(Q);
  19007. end;
  19008. end;
  19009. function StrReplaceCharU(const Find: CharSet; const Replace: WideChar;
  19010. const S: UnicodeString): UnicodeString;
  19011. var P, Q : PWideChar;
  19012. I, J : Integer;
  19013. C : WideChar;
  19014. begin
  19015. Result := S;
  19016. I := PosCharSetU(Find, S);
  19017. if I = 0 then
  19018. exit;
  19019. UniqueString(Result);
  19020. Q := Pointer(Result);
  19021. Inc(Q, I - 1);
  19022. P := Pointer(S);
  19023. Inc(P, I - 1);
  19024. for J := I to Length(S) do
  19025. begin
  19026. C := P^;
  19027. if Ord(C) <= $FF then
  19028. if AnsiChar(Ord(C)) in Find then
  19029. Q^ := Replace;
  19030. Inc(P);
  19031. Inc(Q);
  19032. end;
  19033. end;
  19034. function StrReplaceChar(const Find: CharSet; const Replace: Char;
  19035. const S: String): String;
  19036. var P, Q : PChar;
  19037. I, J : Integer;
  19038. C : Char;
  19039. begin
  19040. Result := S;
  19041. I := PosCharSet(Find, S);
  19042. if I = 0 then
  19043. exit;
  19044. UniqueString(Result);
  19045. Q := Pointer(Result);
  19046. Inc(Q, I - 1);
  19047. P := Pointer(S);
  19048. Inc(P, I - 1);
  19049. for J := I to Length(S) do
  19050. begin
  19051. C := P^;
  19052. {$IFDEF StringIsUnicode}
  19053. if Ord(C) <= $FF then
  19054. {$ENDIF}
  19055. if AnsiChar(Ord(C)) in Find then
  19056. Q^ := Replace;
  19057. Inc(P);
  19058. Inc(Q);
  19059. end;
  19060. end;
  19061. {$ENDIF}
  19062. { }
  19063. { StrReplace operates by replacing in 'batches' of 4096 matches. This has the }
  19064. { advantage of fewer memory allocations and limited stack usage when there is }
  19065. { a large number of matches. }
  19066. { }
  19067. type
  19068. StrReplaceMatchArray = Array[0..4095] of Integer;
  19069. {$IFNDEF CLR}
  19070. function StrReplaceBlockA( // used by StrReplaceA
  19071. const FindLen: Integer; const Replace, S: AnsiString;
  19072. const StartIndex, StopIndex: Integer;
  19073. const MatchCount: Integer;
  19074. const Matches: StrReplaceMatchArray): AnsiString;
  19075. var StrLen : Integer;
  19076. ReplaceLen : Integer;
  19077. NewLen : Integer;
  19078. I, J, F, G : Integer;
  19079. P, Q : PAnsiChar;
  19080. begin
  19081. ReplaceLen := Length(Replace);
  19082. StrLen := StopIndex - StartIndex + 1;
  19083. NewLen := StrLen + (ReplaceLen - FindLen) * MatchCount;
  19084. if NewLen = 0 then
  19085. begin
  19086. Result := '';
  19087. exit;
  19088. end;
  19089. SetString(Result, nil, NewLen);
  19090. P := Pointer(Result);
  19091. Q := Pointer(S);
  19092. F := StartIndex;
  19093. Inc(Q, F - 1);
  19094. for I := 0 to MatchCount - 1 do
  19095. begin
  19096. G := Matches[I];
  19097. J := G - F;
  19098. if J > 0 then
  19099. begin
  19100. MoveMem(Q^, P^, J);
  19101. Inc(P, J);
  19102. Inc(Q, J);
  19103. Inc(F, J);
  19104. end;
  19105. Inc(Q, FindLen);
  19106. Inc(F, FindLen);
  19107. if ReplaceLen > 0 then
  19108. begin
  19109. MoveMem(Pointer(Replace)^, P^, ReplaceLen);
  19110. Inc(P, ReplaceLen);
  19111. end;
  19112. end;
  19113. if F <= StopIndex then
  19114. MoveMem(Q^, P^, StopIndex - F + 1);
  19115. end;
  19116. function StrReplaceBlockW( // used by StrReplaceW
  19117. const FindLen: Integer; const Replace, S: WideString;
  19118. const StartIndex, StopIndex: Integer;
  19119. const MatchCount: Integer;
  19120. const Matches: StrReplaceMatchArray): WideString;
  19121. var StrLen : Integer;
  19122. ReplaceLen : Integer;
  19123. NewLen : Integer;
  19124. I, J, F, G : Integer;
  19125. P, Q : PWideChar;
  19126. begin
  19127. ReplaceLen := Length(Replace);
  19128. StrLen := StopIndex - StartIndex + 1;
  19129. NewLen := StrLen + (ReplaceLen - FindLen) * MatchCount;
  19130. if NewLen = 0 then
  19131. begin
  19132. Result := '';
  19133. exit;
  19134. end;
  19135. SetString(Result, nil, NewLen);
  19136. P := Pointer(Result);
  19137. Q := Pointer(S);
  19138. F := StartIndex;
  19139. Inc(Q, F - 1);
  19140. for I := 0 to MatchCount - 1 do
  19141. begin
  19142. G := Matches[I];
  19143. J := G - F;
  19144. if J > 0 then
  19145. begin
  19146. MoveMem(Q^, P^, J * SizeOf(WideChar));
  19147. Inc(P, J);
  19148. Inc(Q, J);
  19149. Inc(F, J);
  19150. end;
  19151. Inc(Q, FindLen);
  19152. Inc(F, FindLen);
  19153. if ReplaceLen > 0 then
  19154. begin
  19155. MoveMem(Pointer(Replace)^, P^, ReplaceLen * SizeOf(WideChar));
  19156. Inc(P, ReplaceLen);
  19157. end;
  19158. end;
  19159. if F <= StopIndex then
  19160. MoveMem(Q^, P^, (StopIndex - F + 1) * SizeOf(WideChar));
  19161. end;
  19162. function StrReplaceBlockU( // used by StrReplaceU
  19163. const FindLen: Integer; const Replace, S: UnicodeString;
  19164. const StartIndex, StopIndex: Integer;
  19165. const MatchCount: Integer;
  19166. const Matches: StrReplaceMatchArray): UnicodeString;
  19167. var StrLen : Integer;
  19168. ReplaceLen : Integer;
  19169. NewLen : Integer;
  19170. I, J, F, G : Integer;
  19171. P, Q : PWideChar;
  19172. begin
  19173. ReplaceLen := Length(Replace);
  19174. StrLen := StopIndex - StartIndex + 1;
  19175. NewLen := StrLen + (ReplaceLen - FindLen) * MatchCount;
  19176. if NewLen = 0 then
  19177. begin
  19178. Result := '';
  19179. exit;
  19180. end;
  19181. SetString(Result, nil, NewLen);
  19182. P := Pointer(Result);
  19183. Q := Pointer(S);
  19184. F := StartIndex;
  19185. Inc(Q, F - 1);
  19186. for I := 0 to MatchCount - 1 do
  19187. begin
  19188. G := Matches[I];
  19189. J := G - F;
  19190. if J > 0 then
  19191. begin
  19192. MoveMem(Q^, P^, J * SizeOf(WideChar));
  19193. Inc(P, J);
  19194. Inc(Q, J);
  19195. Inc(F, J);
  19196. end;
  19197. Inc(Q, FindLen);
  19198. Inc(F, FindLen);
  19199. if ReplaceLen > 0 then
  19200. begin
  19201. MoveMem(Pointer(Replace)^, P^, ReplaceLen * SizeOf(WideChar));
  19202. Inc(P, ReplaceLen);
  19203. end;
  19204. end;
  19205. if F <= StopIndex then
  19206. MoveMem(Q^, P^, (StopIndex - F + 1) * SizeOf(WideChar));
  19207. end;
  19208. function StrReplaceBlock( // used by StrReplace
  19209. const FindLen: Integer; const Replace, S: String;
  19210. const StartIndex, StopIndex: Integer;
  19211. const MatchCount: Integer;
  19212. const Matches: StrReplaceMatchArray): String;
  19213. var StrLen : Integer;
  19214. ReplaceLen : Integer;
  19215. NewLen : Integer;
  19216. I, J, F, G : Integer;
  19217. P, Q : PChar;
  19218. begin
  19219. ReplaceLen := Length(Replace);
  19220. StrLen := StopIndex - StartIndex + 1;
  19221. NewLen := StrLen + (ReplaceLen - FindLen) * MatchCount;
  19222. if NewLen = 0 then
  19223. begin
  19224. Result := '';
  19225. exit;
  19226. end;
  19227. SetString(Result, nil, NewLen);
  19228. P := Pointer(Result);
  19229. Q := Pointer(S);
  19230. F := StartIndex;
  19231. Inc(Q, F - 1);
  19232. for I := 0 to MatchCount - 1 do
  19233. begin
  19234. G := Matches[I];
  19235. J := G - F;
  19236. if J > 0 then
  19237. begin
  19238. MoveMem(Q^, P^, J * SizeOf(Char));
  19239. Inc(P, J);
  19240. Inc(Q, J);
  19241. Inc(F, J);
  19242. end;
  19243. Inc(Q, FindLen);
  19244. Inc(F, FindLen);
  19245. if ReplaceLen > 0 then
  19246. begin
  19247. MoveMem(Pointer(Replace)^, P^, ReplaceLen * SizeOf(Char));
  19248. Inc(P, ReplaceLen);
  19249. end;
  19250. end;
  19251. if F <= StopIndex then
  19252. MoveMem(Q^, P^, (StopIndex - F + 1) * SizeOf(Char));
  19253. end;
  19254. {$ENDIF}
  19255. {$IFDEF CLR}
  19256. function StrReplaceA(const Find, Replace, S: AnsiString;
  19257. const AsciiCaseSensitive: Boolean): AnsiString;
  19258. begin
  19259. Result := Borland.Vcl.StrUtils.AnsiReplaceStr(S, Find, Replace);
  19260. end;
  19261. {$ELSE}
  19262. function StrReplaceA(const Find, Replace, S: AnsiString; const AsciiCaseSensitive: Boolean): AnsiString;
  19263. var FindLen : Integer;
  19264. Matches : StrReplaceMatchArray;
  19265. C, I, J, K : Integer;
  19266. begin
  19267. FindLen := Length(Find);
  19268. if FindLen = 0 then // nothing to find
  19269. begin
  19270. Result := S;
  19271. exit;
  19272. end;
  19273. I := PosStrA(Find, S, 1, AsciiCaseSensitive);
  19274. if I = 0 then // not found
  19275. begin
  19276. Result := S;
  19277. exit;
  19278. end;
  19279. J := 1;
  19280. Result := '';
  19281. repeat
  19282. C := 0;
  19283. repeat
  19284. Matches[C] := I;
  19285. Inc(C);
  19286. Inc(I, FindLen);
  19287. I := PosStrA(Find, S, I, AsciiCaseSensitive);
  19288. until (I = 0) or (C = 4096);
  19289. if I = 0 then
  19290. K := Length(S)
  19291. else
  19292. K := I - 1;
  19293. Result := Result + StrReplaceBlockA(FindLen, Replace, S, J, K, C, Matches);
  19294. J := K + 1;
  19295. until I = 0;
  19296. end;
  19297. function StrReplaceW(const Find, Replace, S: WideString; const AsciiCaseSensitive: Boolean): WideString;
  19298. var FindLen : Integer;
  19299. Matches : StrReplaceMatchArray;
  19300. C, I, J, K : Integer;
  19301. begin
  19302. FindLen := Length(Find);
  19303. if FindLen = 0 then // nothing to find
  19304. begin
  19305. Result := S;
  19306. exit;
  19307. end;
  19308. I := PosStrW(Find, S, 1, AsciiCaseSensitive);
  19309. if I = 0 then // not found
  19310. begin
  19311. Result := S;
  19312. exit;
  19313. end;
  19314. J := 1;
  19315. Result := '';
  19316. repeat
  19317. C := 0;
  19318. repeat
  19319. Matches[C] := I;
  19320. Inc(C);
  19321. Inc(I, FindLen);
  19322. I := PosStrW(Find, S, I, AsciiCaseSensitive);
  19323. until (I = 0) or (C = 4096);
  19324. if I = 0 then
  19325. K := Length(S)
  19326. else
  19327. K := I - 1;
  19328. Result := Result + StrReplaceBlockW(FindLen, Replace, S, J, K, C, Matches);
  19329. J := K + 1;
  19330. until I = 0;
  19331. end;
  19332. function StrReplaceU(const Find, Replace, S: UnicodeString; const AsciiCaseSensitive: Boolean): UnicodeString;
  19333. var FindLen : Integer;
  19334. Matches : StrReplaceMatchArray;
  19335. C, I, J, K : Integer;
  19336. begin
  19337. FindLen := Length(Find);
  19338. if FindLen = 0 then // nothing to find
  19339. begin
  19340. Result := S;
  19341. exit;
  19342. end;
  19343. I := PosStrU(Find, S, 1, AsciiCaseSensitive);
  19344. if I = 0 then // not found
  19345. begin
  19346. Result := S;
  19347. exit;
  19348. end;
  19349. J := 1;
  19350. Result := '';
  19351. repeat
  19352. C := 0;
  19353. repeat
  19354. Matches[C] := I;
  19355. Inc(C);
  19356. Inc(I, FindLen);
  19357. I := PosStrU(Find, S, I, AsciiCaseSensitive);
  19358. until (I = 0) or (C = 4096);
  19359. if I = 0 then
  19360. K := Length(S)
  19361. else
  19362. K := I - 1;
  19363. Result := Result + StrReplaceBlockU(FindLen, Replace, S, J, K, C, Matches);
  19364. J := K + 1;
  19365. until I = 0;
  19366. end;
  19367. function StrReplace(const Find, Replace, S: String; const AsciiCaseSensitive: Boolean): String;
  19368. var FindLen : Integer;
  19369. Matches : StrReplaceMatchArray;
  19370. C, I, J, K : Integer;
  19371. begin
  19372. FindLen := Length(Find);
  19373. if FindLen = 0 then // nothing to find
  19374. begin
  19375. Result := S;
  19376. exit;
  19377. end;
  19378. I := PosStr(Find, S, 1, AsciiCaseSensitive);
  19379. if I = 0 then // not found
  19380. begin
  19381. Result := S;
  19382. exit;
  19383. end;
  19384. J := 1;
  19385. Result := '';
  19386. repeat
  19387. C := 0;
  19388. repeat
  19389. Matches[C] := I;
  19390. Inc(C);
  19391. Inc(I, FindLen);
  19392. I := PosStr(Find, S, I, AsciiCaseSensitive);
  19393. until (I = 0) or (C = 4096);
  19394. if I = 0 then
  19395. K := Length(S)
  19396. else
  19397. K := I - 1;
  19398. Result := Result + StrReplaceBlock(FindLen, Replace, S, J, K, C, Matches);
  19399. J := K + 1;
  19400. until I = 0;
  19401. end;
  19402. {$ENDIF}
  19403. {$IFNDEF CLR}
  19404. function StrReplaceA(const Find: CharSet; const Replace, S: AnsiString): AnsiString;
  19405. var Matches : StrReplaceMatchArray;
  19406. C, I, J, K : Integer;
  19407. begin
  19408. I := PosCharSetA(Find, S, 1);
  19409. if I = 0 then // not found
  19410. begin
  19411. Result := S;
  19412. exit;
  19413. end;
  19414. J := 1;
  19415. Result := '';
  19416. repeat
  19417. C := 0;
  19418. repeat
  19419. Matches[C] := I;
  19420. Inc(C);
  19421. Inc(I);
  19422. I := PosCharSetA(Find, S, I);
  19423. until (I = 0) or (C = 4096);
  19424. if I = 0 then
  19425. K := Length(S)
  19426. else
  19427. K := I - 1;
  19428. Result := Result + StrReplaceBlockA(1, Replace, S, J, K, C, Matches);
  19429. J := K + 1;
  19430. until I = 0;
  19431. end;
  19432. function StrReplaceW(const Find: CharSet; const Replace, S: WideString): WideString;
  19433. var Matches : StrReplaceMatchArray;
  19434. C, I, J, K : Integer;
  19435. begin
  19436. I := PosCharSetW(Find, S, 1);
  19437. if I = 0 then // not found
  19438. begin
  19439. Result := S;
  19440. exit;
  19441. end;
  19442. J := 1;
  19443. Result := '';
  19444. repeat
  19445. C := 0;
  19446. repeat
  19447. Matches[C] := I;
  19448. Inc(C);
  19449. Inc(I);
  19450. I := PosCharSetW(Find, S, I);
  19451. until (I = 0) or (C = 4096);
  19452. if I = 0 then
  19453. K := Length(S)
  19454. else
  19455. K := I - 1;
  19456. Result := Result + StrReplaceBlockW(1, Replace, S, J, K, C, Matches);
  19457. J := K + 1;
  19458. until I = 0;
  19459. end;
  19460. function StrReplaceU(const Find: CharSet; const Replace, S: UnicodeString): UnicodeString;
  19461. var Matches : StrReplaceMatchArray;
  19462. C, I, J, K : Integer;
  19463. begin
  19464. I := PosCharSetU(Find, S, 1);
  19465. if I = 0 then // not found
  19466. begin
  19467. Result := S;
  19468. exit;
  19469. end;
  19470. J := 1;
  19471. Result := '';
  19472. repeat
  19473. C := 0;
  19474. repeat
  19475. Matches[C] := I;
  19476. Inc(C);
  19477. Inc(I);
  19478. I := PosCharSetU(Find, S, I);
  19479. until (I = 0) or (C = 4096);
  19480. if I = 0 then
  19481. K := Length(S)
  19482. else
  19483. K := I - 1;
  19484. Result := Result + StrReplaceBlockU(1, Replace, S, J, K, C, Matches);
  19485. J := K + 1;
  19486. until I = 0;
  19487. end;
  19488. function StrReplace(const Find: CharSet; const Replace, S: String): String;
  19489. var Matches : StrReplaceMatchArray;
  19490. C, I, J, K : Integer;
  19491. begin
  19492. I := PosCharSet(Find, S, 1);
  19493. if I = 0 then // not found
  19494. begin
  19495. Result := S;
  19496. exit;
  19497. end;
  19498. J := 1;
  19499. Result := '';
  19500. repeat
  19501. C := 0;
  19502. repeat
  19503. Matches[C] := I;
  19504. Inc(C);
  19505. Inc(I);
  19506. I := PosCharSet(Find, S, I);
  19507. until (I = 0) or (C = 4096);
  19508. if I = 0 then
  19509. K := Length(S)
  19510. else
  19511. K := I - 1;
  19512. Result := Result + StrReplaceBlock(1, Replace, S, J, K, C, Matches);
  19513. J := K + 1;
  19514. until I = 0;
  19515. end;
  19516. function StrReplaceCharStrA(const Find: AnsiChar; const Replace, S: AnsiString): AnsiString;
  19517. var Matches : StrReplaceMatchArray;
  19518. C, I, J, K : Integer;
  19519. begin
  19520. I := PosCharA(Find, S, 1);
  19521. if I = 0 then // not found
  19522. begin
  19523. Result := S;
  19524. exit;
  19525. end;
  19526. J := 1;
  19527. Result := '';
  19528. repeat
  19529. C := 0;
  19530. repeat
  19531. Matches[C] := I;
  19532. Inc(C);
  19533. Inc(I);
  19534. I := PosCharA(Find, S, I);
  19535. until (I = 0) or (C = 4096);
  19536. if I = 0 then
  19537. K := Length(S)
  19538. else
  19539. K := I - 1;
  19540. Result := Result + StrReplaceBlockA(1, Replace, S, J, K, C, Matches);
  19541. J := K + 1;
  19542. until I = 0;
  19543. end;
  19544. function StrReplaceCharStrW(const Find: WideChar; const Replace, S: WideString): WideString;
  19545. var Matches : StrReplaceMatchArray;
  19546. C, I, J, K : Integer;
  19547. begin
  19548. I := PosCharW(Find, S, 1);
  19549. if I = 0 then // not found
  19550. begin
  19551. Result := S;
  19552. exit;
  19553. end;
  19554. J := 1;
  19555. Result := '';
  19556. repeat
  19557. C := 0;
  19558. repeat
  19559. Matches[C] := I;
  19560. Inc(C);
  19561. Inc(I);
  19562. I := PosCharW(Find, S, I);
  19563. until (I = 0) or (C = 4096);
  19564. if I = 0 then
  19565. K := Length(S)
  19566. else
  19567. K := I - 1;
  19568. Result := Result + StrReplaceBlockW(1, Replace, S, J, K, C, Matches);
  19569. J := K + 1;
  19570. until I = 0;
  19571. end;
  19572. function StrReplaceCharStrU(const Find: WideChar; const Replace, S: UnicodeString): UnicodeString;
  19573. var Matches : StrReplaceMatchArray;
  19574. C, I, J, K : Integer;
  19575. begin
  19576. I := PosCharU(Find, S, 1);
  19577. if I = 0 then // not found
  19578. begin
  19579. Result := S;
  19580. exit;
  19581. end;
  19582. J := 1;
  19583. Result := '';
  19584. repeat
  19585. C := 0;
  19586. repeat
  19587. Matches[C] := I;
  19588. Inc(C);
  19589. Inc(I);
  19590. I := PosCharU(Find, S, I);
  19591. until (I = 0) or (C = 4096);
  19592. if I = 0 then
  19593. K := Length(S)
  19594. else
  19595. K := I - 1;
  19596. Result := Result + StrReplaceBlockU(1, Replace, S, J, K, C, Matches);
  19597. J := K + 1;
  19598. until I = 0;
  19599. end;
  19600. {$ENDIF}
  19601. {$IFDEF CLR}
  19602. function StrRemoveDupA(const S: AnsiString; const C: AnsiChar): AnsiString;
  19603. begin
  19604. Result := StrReplaceA(DupChar(C, 2), C, S);
  19605. end;
  19606. {$ELSE}
  19607. function StrRemoveDupA(const S: AnsiString; const C: AnsiChar): AnsiString;
  19608. var P, Q : PAnsiChar;
  19609. D, E : AnsiChar;
  19610. I, L, M : Integer;
  19611. R : Boolean;
  19612. begin
  19613. L := Length(S);
  19614. if L <= 1 then
  19615. begin
  19616. Result := S;
  19617. exit;
  19618. end;
  19619. // Check for duplicate
  19620. P := Pointer(S);
  19621. D := P^;
  19622. Inc(P);
  19623. R := False;
  19624. for I := 2 to L do
  19625. if (D = C) and (P^ = C) then
  19626. begin
  19627. R := True;
  19628. break;
  19629. end
  19630. else
  19631. begin
  19632. D := P^;
  19633. Inc(P);
  19634. end;
  19635. if not R then
  19636. begin
  19637. Result := S;
  19638. exit;
  19639. end;
  19640. // Remove duplicates
  19641. Result := S;
  19642. UniqueString(Result);
  19643. P := Pointer(S);
  19644. Q := Pointer(Result);
  19645. D := P^;
  19646. Q^ := D;
  19647. Inc(P);
  19648. Inc(Q);
  19649. M := 1;
  19650. for I := 2 to L do
  19651. begin
  19652. E := P^;
  19653. if (D <> C) or (E <> C) then
  19654. begin
  19655. D := E;
  19656. Q^ := E;
  19657. Inc(M);
  19658. Inc(Q);
  19659. end;
  19660. Inc(P);
  19661. end;
  19662. if M < L then
  19663. SetLength(Result, M);
  19664. end;
  19665. function StrRemoveDupW(const S: WideString; const C: WideChar): WideString;
  19666. var P, Q : PWideChar;
  19667. D, E : WideChar;
  19668. I, L, M : Integer;
  19669. R : Boolean;
  19670. begin
  19671. L := Length(S);
  19672. if L <= 1 then
  19673. begin
  19674. Result := S;
  19675. exit;
  19676. end;
  19677. // Check for duplicate
  19678. P := Pointer(S);
  19679. D := P^;
  19680. Inc(P);
  19681. R := False;
  19682. for I := 2 to L do
  19683. if (D = C) and (P^ = C) then
  19684. begin
  19685. R := True;
  19686. break;
  19687. end
  19688. else
  19689. begin
  19690. D := P^;
  19691. Inc(P);
  19692. end;
  19693. if not R then
  19694. begin
  19695. Result := S;
  19696. exit;
  19697. end;
  19698. // Remove duplicates
  19699. Result := S;
  19700. UniqueString(Result);
  19701. P := Pointer(S);
  19702. Q := Pointer(Result);
  19703. D := P^;
  19704. Q^ := D;
  19705. Inc(P);
  19706. Inc(Q);
  19707. M := 1;
  19708. for I := 2 to L do
  19709. begin
  19710. E := P^;
  19711. if (D <> C) or (E <> C) then
  19712. begin
  19713. D := E;
  19714. Q^ := E;
  19715. Inc(M);
  19716. Inc(Q);
  19717. end;
  19718. Inc(P);
  19719. end;
  19720. if M < L then
  19721. SetLength(Result, M);
  19722. end;
  19723. function StrRemoveDupU(const S: UnicodeString; const C: WideChar): UnicodeString;
  19724. var P, Q : PWideChar;
  19725. D, E : WideChar;
  19726. I, L, M : Integer;
  19727. R : Boolean;
  19728. begin
  19729. L := Length(S);
  19730. if L <= 1 then
  19731. begin
  19732. Result := S;
  19733. exit;
  19734. end;
  19735. // Check for duplicate
  19736. P := Pointer(S);
  19737. D := P^;
  19738. Inc(P);
  19739. R := False;
  19740. for I := 2 to L do
  19741. if (D = C) and (P^ = C) then
  19742. begin
  19743. R := True;
  19744. break;
  19745. end
  19746. else
  19747. begin
  19748. D := P^;
  19749. Inc(P);
  19750. end;
  19751. if not R then
  19752. begin
  19753. Result := S;
  19754. exit;
  19755. end;
  19756. // Remove duplicates
  19757. Result := S;
  19758. UniqueString(Result);
  19759. P := Pointer(S);
  19760. Q := Pointer(Result);
  19761. D := P^;
  19762. Q^ := D;
  19763. Inc(P);
  19764. Inc(Q);
  19765. M := 1;
  19766. for I := 2 to L do
  19767. begin
  19768. E := P^;
  19769. if (D <> C) or (E <> C) then
  19770. begin
  19771. D := E;
  19772. Q^ := E;
  19773. Inc(M);
  19774. Inc(Q);
  19775. end;
  19776. Inc(P);
  19777. end;
  19778. if M < L then
  19779. SetLength(Result, M);
  19780. end;
  19781. function StrRemoveDup(const S: String; const C: Char): String;
  19782. var P, Q : PChar;
  19783. D, E : Char;
  19784. I, L, M : Integer;
  19785. R : Boolean;
  19786. begin
  19787. L := Length(S);
  19788. if L <= 1 then
  19789. begin
  19790. Result := S;
  19791. exit;
  19792. end;
  19793. // Check for duplicate
  19794. P := Pointer(S);
  19795. D := P^;
  19796. Inc(P);
  19797. R := False;
  19798. for I := 2 to L do
  19799. if (D = C) and (P^ = C) then
  19800. begin
  19801. R := True;
  19802. break;
  19803. end
  19804. else
  19805. begin
  19806. D := P^;
  19807. Inc(P);
  19808. end;
  19809. if not R then
  19810. begin
  19811. Result := S;
  19812. exit;
  19813. end;
  19814. // Remove duplicates
  19815. Result := S;
  19816. UniqueString(Result);
  19817. P := Pointer(S);
  19818. Q := Pointer(Result);
  19819. D := P^;
  19820. Q^ := D;
  19821. Inc(P);
  19822. Inc(Q);
  19823. M := 1;
  19824. for I := 2 to L do
  19825. begin
  19826. E := P^;
  19827. if (D <> C) or (E <> C) then
  19828. begin
  19829. D := E;
  19830. Q^ := E;
  19831. Inc(M);
  19832. Inc(Q);
  19833. end;
  19834. Inc(P);
  19835. end;
  19836. if M < L then
  19837. SetLength(Result, M);
  19838. end;
  19839. {$ENDIF}
  19840. {$IFDEF CLR}
  19841. function StrRemoveChar(const S: AnsiString; const C: AnsiChar): AnsiString;
  19842. begin
  19843. Result := StrReplaceA(C, '', S);
  19844. end;
  19845. {$ELSE}
  19846. function StrRemoveCharA(const S: AnsiString; const C: AnsiChar): AnsiString;
  19847. var P, Q : PAnsiChar;
  19848. I, L, M : Integer;
  19849. begin
  19850. L := Length(S);
  19851. if L = 0 then
  19852. begin
  19853. Result := '';
  19854. exit;
  19855. end;
  19856. M := 0;
  19857. P := Pointer(S);
  19858. for I := 1 to L do
  19859. begin
  19860. if P^ = C then
  19861. Inc(M);
  19862. Inc(P);
  19863. end;
  19864. if M = 0 then
  19865. begin
  19866. Result := S;
  19867. exit;
  19868. end;
  19869. SetLength(Result, L - M);
  19870. Q := Pointer(Result);
  19871. P := Pointer(S);
  19872. for I := 1 to L do
  19873. begin
  19874. if P^ <> C then
  19875. begin
  19876. Q^ := P^;
  19877. Inc(Q);
  19878. end;
  19879. Inc(P);
  19880. end;
  19881. end;
  19882. function StrRemoveCharW(const S: WideString; const C: WideChar): WideString;
  19883. var P, Q : PWideChar;
  19884. I, L, M : Integer;
  19885. begin
  19886. L := Length(S);
  19887. if L = 0 then
  19888. begin
  19889. Result := '';
  19890. exit;
  19891. end;
  19892. M := 0;
  19893. P := Pointer(S);
  19894. for I := 1 to L do
  19895. begin
  19896. if P^ = C then
  19897. Inc(M);
  19898. Inc(P);
  19899. end;
  19900. if M = 0 then
  19901. begin
  19902. Result := S;
  19903. exit;
  19904. end;
  19905. SetLength(Result, L - M);
  19906. Q := Pointer(Result);
  19907. P := Pointer(S);
  19908. for I := 1 to L do
  19909. begin
  19910. if P^ <> C then
  19911. begin
  19912. Q^ := P^;
  19913. Inc(Q);
  19914. end;
  19915. Inc(P);
  19916. end;
  19917. end;
  19918. function StrRemoveCharU(const S: UnicodeString; const C: WideChar): UnicodeString;
  19919. var P, Q : PWideChar;
  19920. I, L, M : Integer;
  19921. begin
  19922. L := Length(S);
  19923. if L = 0 then
  19924. begin
  19925. Result := '';
  19926. exit;
  19927. end;
  19928. M := 0;
  19929. P := Pointer(S);
  19930. for I := 1 to L do
  19931. begin
  19932. if P^ = C then
  19933. Inc(M);
  19934. Inc(P);
  19935. end;
  19936. if M = 0 then
  19937. begin
  19938. Result := S;
  19939. exit;
  19940. end;
  19941. SetLength(Result, L - M);
  19942. Q := Pointer(Result);
  19943. P := Pointer(S);
  19944. for I := 1 to L do
  19945. begin
  19946. if P^ <> C then
  19947. begin
  19948. Q^ := P^;
  19949. Inc(Q);
  19950. end;
  19951. Inc(P);
  19952. end;
  19953. end;
  19954. function StrRemoveChar(const S: String; const C: Char): String;
  19955. var P, Q : PChar;
  19956. I, L, M : Integer;
  19957. begin
  19958. L := Length(S);
  19959. if L = 0 then
  19960. begin
  19961. Result := '';
  19962. exit;
  19963. end;
  19964. M := 0;
  19965. P := Pointer(S);
  19966. for I := 1 to L do
  19967. begin
  19968. if P^ = C then
  19969. Inc(M);
  19970. Inc(P);
  19971. end;
  19972. if M = 0 then
  19973. begin
  19974. Result := S;
  19975. exit;
  19976. end;
  19977. SetLength(Result, L - M);
  19978. Q := Pointer(Result);
  19979. P := Pointer(S);
  19980. for I := 1 to L do
  19981. begin
  19982. if P^ <> C then
  19983. begin
  19984. Q^ := P^;
  19985. Inc(Q);
  19986. end;
  19987. Inc(P);
  19988. end;
  19989. end;
  19990. function StrRemoveCharSetA(const S: AnsiString; const C: CharSet): AnsiString;
  19991. var P, Q : PAnsiChar;
  19992. I, L, M : Integer;
  19993. begin
  19994. L := Length(S);
  19995. if L = 0 then
  19996. begin
  19997. Result := '';
  19998. exit;
  19999. end;
  20000. M := 0;
  20001. P := Pointer(S);
  20002. for I := 1 to L do
  20003. begin
  20004. if P^ in C then
  20005. Inc(M);
  20006. Inc(P);
  20007. end;
  20008. if M = 0 then
  20009. begin
  20010. Result := S;
  20011. exit;
  20012. end;
  20013. SetLength(Result, L - M);
  20014. Q := Pointer(Result);
  20015. P := Pointer(S);
  20016. for I := 1 to L do
  20017. begin
  20018. if not (P^ in C) then
  20019. begin
  20020. Q^ := P^;
  20021. Inc(Q);
  20022. end;
  20023. Inc(P);
  20024. end;
  20025. end;
  20026. function StrRemoveCharSetW(const S: WideString; const C: CharSet): WideString;
  20027. var P, Q : PWideChar;
  20028. D : WideChar;
  20029. I, L, M : Integer;
  20030. R : Boolean;
  20031. begin
  20032. L := Length(S);
  20033. if L = 0 then
  20034. begin
  20035. Result := '';
  20036. exit;
  20037. end;
  20038. M := 0;
  20039. P := Pointer(S);
  20040. for I := 1 to L do
  20041. begin
  20042. D := P^;
  20043. if Ord(D) <= $FF then
  20044. if AnsiChar(Ord(D)) in C then
  20045. Inc(M);
  20046. Inc(P);
  20047. end;
  20048. if M = 0 then
  20049. begin
  20050. Result := S;
  20051. exit;
  20052. end;
  20053. SetLength(Result, L - M);
  20054. Q := Pointer(Result);
  20055. P := Pointer(S);
  20056. for I := 1 to L do
  20057. begin
  20058. D := P^;
  20059. R := Ord(D) > $FF;
  20060. if not R then
  20061. R := not (AnsiChar(Ord(D)) in C);
  20062. if R then
  20063. begin
  20064. Q^ := P^;
  20065. Inc(Q);
  20066. end;
  20067. Inc(P);
  20068. end;
  20069. end;
  20070. function StrRemoveCharSetU(const S: UnicodeString; const C: CharSet): UnicodeString;
  20071. var P, Q : PWideChar;
  20072. D : WideChar;
  20073. I, L, M : Integer;
  20074. R : Boolean;
  20075. begin
  20076. L := Length(S);
  20077. if L = 0 then
  20078. begin
  20079. Result := '';
  20080. exit;
  20081. end;
  20082. M := 0;
  20083. P := Pointer(S);
  20084. for I := 1 to L do
  20085. begin
  20086. D := P^;
  20087. if Ord(D) <= $FF then
  20088. if AnsiChar(Ord(D)) in C then
  20089. Inc(M);
  20090. Inc(P);
  20091. end;
  20092. if M = 0 then
  20093. begin
  20094. Result := S;
  20095. exit;
  20096. end;
  20097. SetLength(Result, L - M);
  20098. Q := Pointer(Result);
  20099. P := Pointer(S);
  20100. for I := 1 to L do
  20101. begin
  20102. D := P^;
  20103. R := Ord(D) > $FF;
  20104. if not R then
  20105. R := not (AnsiChar(Ord(D)) in C);
  20106. if R then
  20107. begin
  20108. Q^ := P^;
  20109. Inc(Q);
  20110. end;
  20111. Inc(P);
  20112. end;
  20113. end;
  20114. function StrRemoveCharSet(const S: String; const C: CharSet): String;
  20115. var P, Q : PChar;
  20116. D : Char;
  20117. I, L, M : Integer;
  20118. R : Boolean;
  20119. begin
  20120. L := Length(S);
  20121. if L = 0 then
  20122. begin
  20123. Result := '';
  20124. exit;
  20125. end;
  20126. M := 0;
  20127. P := Pointer(S);
  20128. for I := 1 to L do
  20129. begin
  20130. D := P^;
  20131. {$IFDEF StringIsUnicode}
  20132. if Ord(D) <= $FF then
  20133. {$ENDIF}
  20134. if AnsiChar(Ord(D)) in C then
  20135. Inc(M);
  20136. Inc(P);
  20137. end;
  20138. if M = 0 then
  20139. begin
  20140. Result := S;
  20141. exit;
  20142. end;
  20143. SetLength(Result, L - M);
  20144. Q := Pointer(Result);
  20145. P := Pointer(S);
  20146. for I := 1 to L do
  20147. begin
  20148. D := P^;
  20149. {$IFDEF StringIsUnicode}
  20150. R := Ord(D) > $FF;
  20151. if not R then
  20152. {$ENDIF}
  20153. R := not (AnsiChar(Ord(D)) in C);
  20154. if R then
  20155. begin
  20156. Q^ := P^;
  20157. Inc(Q);
  20158. end;
  20159. Inc(P);
  20160. end;
  20161. end;
  20162. {$ENDIF}
  20163. { }
  20164. { Split }
  20165. { }
  20166. function StrSplitAtA(const S: AnsiString; const C: AnsiString;
  20167. var Left, Right: AnsiString; const AsciiCaseSensitive: Boolean;
  20168. const Optional: Boolean): Boolean;
  20169. var I : Integer;
  20170. T : AnsiString;
  20171. begin
  20172. I := PosStrA(C, S, 1, AsciiCaseSensitive);
  20173. Result := I > 0;
  20174. if Result then
  20175. begin
  20176. T := S;
  20177. Left := Copy(T, 1, I - 1);
  20178. Right := CopyFromA(T, I + Length(C));
  20179. end
  20180. else
  20181. begin
  20182. if Optional then
  20183. Left := S
  20184. else
  20185. Left := '';
  20186. Right := '';
  20187. end;
  20188. end;
  20189. function StrSplitAtW(const S: WideString; const C: WideString;
  20190. var Left, Right: WideString; const AsciiCaseSensitive: Boolean;
  20191. const Optional: Boolean): Boolean;
  20192. var I : Integer;
  20193. T : WideString;
  20194. begin
  20195. I := PosStrW(C, S, 1, AsciiCaseSensitive);
  20196. Result := I > 0;
  20197. if Result then
  20198. begin
  20199. T := S;
  20200. Left := Copy(T, 1, I - 1);
  20201. Right := CopyFromW(T, I + Length(C));
  20202. end
  20203. else
  20204. begin
  20205. if Optional then
  20206. Left := S
  20207. else
  20208. Left := '';
  20209. Right := '';
  20210. end;
  20211. end;
  20212. function StrSplitAtU(const S: UnicodeString; const C: UnicodeString;
  20213. var Left, Right: UnicodeString; const AsciiCaseSensitive: Boolean;
  20214. const Optional: Boolean): Boolean;
  20215. var I : Integer;
  20216. T : UnicodeString;
  20217. begin
  20218. I := PosStrU(C, S, 1, AsciiCaseSensitive);
  20219. Result := I > 0;
  20220. if Result then
  20221. begin
  20222. T := S;
  20223. Left := Copy(T, 1, I - 1);
  20224. Right := CopyFromU(T, I + Length(C));
  20225. end
  20226. else
  20227. begin
  20228. if Optional then
  20229. Left := S
  20230. else
  20231. Left := '';
  20232. Right := '';
  20233. end;
  20234. end;
  20235. function StrSplitAt(const S: String; const C: String;
  20236. var Left, Right: String; const AsciiCaseSensitive: Boolean;
  20237. const Optional: Boolean): Boolean;
  20238. var I : Integer;
  20239. T : WideString;
  20240. begin
  20241. I := PosStr(C, S, 1, AsciiCaseSensitive);
  20242. Result := I > 0;
  20243. if Result then
  20244. begin
  20245. T := S;
  20246. Left := Copy(T, 1, I - 1);
  20247. Right := CopyFrom(T, I + Length(C));
  20248. end
  20249. else
  20250. begin
  20251. if Optional then
  20252. Left := S
  20253. else
  20254. Left := '';
  20255. Right := '';
  20256. end;
  20257. end;
  20258. function StrSplitAtCharA(const S: AnsiString; const C: AnsiChar;
  20259. var Left, Right: AnsiString; const Optional: Boolean): Boolean;
  20260. var I : Integer;
  20261. T : AnsiString;
  20262. begin
  20263. I := PosCharA(C, S);
  20264. Result := I > 0;
  20265. if Result then
  20266. begin
  20267. T := S; // add reference to S (in case it is also Left or Right)
  20268. Left := Copy(T, 1, I - 1);
  20269. Right := CopyFromA(T, I + 1);
  20270. end
  20271. else
  20272. begin
  20273. if Optional then
  20274. Left := S
  20275. else
  20276. Left := '';
  20277. Right := '';
  20278. end;
  20279. end;
  20280. function StrSplitAtCharW(const S: WideString; const C: WideChar;
  20281. var Left, Right: WideString; const Optional: Boolean): Boolean;
  20282. var I : Integer;
  20283. T : WideString;
  20284. begin
  20285. I := PosCharW(C, S);
  20286. Result := I > 0;
  20287. if Result then
  20288. begin
  20289. T := S; // add reference to S (in case it is also Left or Right)
  20290. Left := Copy(T, 1, I - 1);
  20291. Right := CopyFromW(T, I + 1);
  20292. end
  20293. else
  20294. begin
  20295. if Optional then
  20296. Left := S
  20297. else
  20298. Left := '';
  20299. Right := '';
  20300. end;
  20301. end;
  20302. function StrSplitAtCharU(const S: UnicodeString; const C: WideChar;
  20303. var Left, Right: UnicodeString; const Optional: Boolean): Boolean;
  20304. var I : Integer;
  20305. T : UnicodeString;
  20306. begin
  20307. I := PosCharU(C, S);
  20308. Result := I > 0;
  20309. if Result then
  20310. begin
  20311. T := S; // add reference to S (in case it is also Left or Right)
  20312. Left := Copy(T, 1, I - 1);
  20313. Right := CopyFromW(T, I + 1);
  20314. end
  20315. else
  20316. begin
  20317. if Optional then
  20318. Left := S
  20319. else
  20320. Left := '';
  20321. Right := '';
  20322. end;
  20323. end;
  20324. function StrSplitAtChar(const S: String; const C: Char;
  20325. var Left, Right: String; const Optional: Boolean): Boolean;
  20326. var I : Integer;
  20327. T : WideString;
  20328. begin
  20329. I := PosChar(C, S);
  20330. Result := I > 0;
  20331. if Result then
  20332. begin
  20333. T := S; // add reference to S (in case it is also Left or Right)
  20334. Left := Copy(T, 1, I - 1);
  20335. Right := CopyFrom(T, I + 1);
  20336. end
  20337. else
  20338. begin
  20339. if Optional then
  20340. Left := S
  20341. else
  20342. Left := '';
  20343. Right := '';
  20344. end;
  20345. end;
  20346. function StrSplitAtCharSetA(const S: AnsiString; const C: CharSet;
  20347. var Left, Right: AnsiString; const Optional: Boolean): Boolean;
  20348. var I : Integer;
  20349. T : AnsiString;
  20350. begin
  20351. I := PosCharSetA(C, S);
  20352. Result := I > 0;
  20353. if Result then
  20354. begin
  20355. T := S;
  20356. Left := Copy(T, 1, I - 1);
  20357. Right := CopyFromA(T, I + 1);
  20358. end else
  20359. begin
  20360. if Optional then
  20361. Left := S
  20362. else
  20363. Left := '';
  20364. Right := '';
  20365. end;
  20366. end;
  20367. function StrSplitA(const S, D: AnsiString): AnsiStringArray;
  20368. var I, J, L, M : Integer;
  20369. begin
  20370. // Check valid parameters
  20371. if S = '' then
  20372. begin
  20373. Result := nil;
  20374. exit;
  20375. end;
  20376. M := Length(D);
  20377. if M = 0 then
  20378. begin
  20379. SetLength(Result, 1);
  20380. Result[0] := S;
  20381. exit;
  20382. end;
  20383. // Count
  20384. L := 0;
  20385. I := 1;
  20386. repeat
  20387. I := PosStrA(D, S, I, True);
  20388. if I = 0 then
  20389. break;
  20390. Inc(L);
  20391. Inc(I, M);
  20392. until False;
  20393. SetLength(Result, L + 1);
  20394. if L = 0 then
  20395. begin
  20396. // No split
  20397. Result[0] := S;
  20398. exit;
  20399. end;
  20400. // Split
  20401. L := 0;
  20402. I := 1;
  20403. repeat
  20404. J := PosStrA(D, S, I, True);
  20405. if J = 0 then
  20406. begin
  20407. Result[L] := CopyFromA(S, I);
  20408. break;
  20409. end;
  20410. Result[L] := CopyRangeA(S, I, J - 1);
  20411. Inc(L);
  20412. I := J + M;
  20413. until False;
  20414. end;
  20415. function StrSplitW(const S, D: WideString): WideStringArray;
  20416. var I, J, L, M : Integer;
  20417. begin
  20418. // Check valid parameters
  20419. if S = '' then
  20420. begin
  20421. Result := nil;
  20422. exit;
  20423. end;
  20424. M := Length(D);
  20425. if M = 0 then
  20426. begin
  20427. SetLength(Result, 1);
  20428. Result[0] := S;
  20429. exit;
  20430. end;
  20431. // Count
  20432. L := 0;
  20433. I := 1;
  20434. repeat
  20435. I := PosStrW(D, S, I, True);
  20436. if I = 0 then
  20437. break;
  20438. Inc(L);
  20439. Inc(I, M);
  20440. until False;
  20441. SetLength(Result, L + 1);
  20442. if L = 0 then
  20443. begin
  20444. // No split
  20445. Result[0] := S;
  20446. exit;
  20447. end;
  20448. // Split
  20449. L := 0;
  20450. I := 1;
  20451. repeat
  20452. J := PosStrW(D, S, I, True);
  20453. if J = 0 then
  20454. begin
  20455. Result[L] := CopyFromW(S, I);
  20456. break;
  20457. end;
  20458. Result[L] := CopyRangeW(S, I, J - 1);
  20459. Inc(L);
  20460. I := J + M;
  20461. until False;
  20462. end;
  20463. function StrSplitU(const S, D: UnicodeString): UnicodeStringArray;
  20464. var I, J, L, M : Integer;
  20465. begin
  20466. // Check valid parameters
  20467. if S = '' then
  20468. begin
  20469. Result := nil;
  20470. exit;
  20471. end;
  20472. M := Length(D);
  20473. if M = 0 then
  20474. begin
  20475. SetLength(Result, 1);
  20476. Result[0] := S;
  20477. exit;
  20478. end;
  20479. // Count
  20480. L := 0;
  20481. I := 1;
  20482. repeat
  20483. I := PosStrU(D, S, I, True);
  20484. if I = 0 then
  20485. break;
  20486. Inc(L);
  20487. Inc(I, M);
  20488. until False;
  20489. SetLength(Result, L + 1);
  20490. if L = 0 then
  20491. begin
  20492. // No split
  20493. Result[0] := S;
  20494. exit;
  20495. end;
  20496. // Split
  20497. L := 0;
  20498. I := 1;
  20499. repeat
  20500. J := PosStrU(D, S, I, True);
  20501. if J = 0 then
  20502. begin
  20503. Result[L] := CopyFromU(S, I);
  20504. break;
  20505. end;
  20506. Result[L] := CopyRangeU(S, I, J - 1);
  20507. Inc(L);
  20508. I := J + M;
  20509. until False;
  20510. end;
  20511. function StrSplit(const S, D: String): StringArray;
  20512. var I, J, L, M : Integer;
  20513. begin
  20514. // Check valid parameters
  20515. if S = '' then
  20516. begin
  20517. Result := nil;
  20518. exit;
  20519. end;
  20520. M := Length(D);
  20521. if M = 0 then
  20522. begin
  20523. SetLength(Result, 1);
  20524. Result[0] := S;
  20525. exit;
  20526. end;
  20527. // Count
  20528. L := 0;
  20529. I := 1;
  20530. repeat
  20531. I := PosStr(D, S, I, True);
  20532. if I = 0 then
  20533. break;
  20534. Inc(L);
  20535. Inc(I, M);
  20536. until False;
  20537. SetLength(Result, L + 1);
  20538. if L = 0 then
  20539. begin
  20540. // No split
  20541. Result[0] := S;
  20542. exit;
  20543. end;
  20544. // Split
  20545. L := 0;
  20546. I := 1;
  20547. repeat
  20548. J := PosStr(D, S, I, True);
  20549. if J = 0 then
  20550. begin
  20551. Result[L] := CopyFrom(S, I);
  20552. break;
  20553. end;
  20554. Result[L] := CopyRange(S, I, J - 1);
  20555. Inc(L);
  20556. I := J + M;
  20557. until False;
  20558. end;
  20559. function StrSplitCharA(const S: AnsiString; const D: AnsiChar): AnsiStringArray;
  20560. var I, J, L : Integer;
  20561. begin
  20562. // Check valid parameters
  20563. if S = '' then
  20564. begin
  20565. Result := nil;
  20566. exit;
  20567. end;
  20568. // Count
  20569. L := 0;
  20570. I := 1;
  20571. repeat
  20572. I := PosCharA(D, S, I);
  20573. if I = 0 then
  20574. break;
  20575. Inc(L);
  20576. Inc(I);
  20577. until False;
  20578. SetLength(Result, L + 1);
  20579. if L = 0 then
  20580. begin
  20581. // No split
  20582. Result[0] := S;
  20583. exit;
  20584. end;
  20585. // Split
  20586. L := 0;
  20587. I := 1;
  20588. repeat
  20589. J := PosCharA(D, S, I);
  20590. if J = 0 then
  20591. begin
  20592. Result[L] := CopyFromA(S, I);
  20593. break;
  20594. end;
  20595. Result[L] := CopyRangeA(S, I, J - 1);
  20596. Inc(L);
  20597. I := J + 1;
  20598. until False;
  20599. end;
  20600. function StrSplitCharW(const S: WideString; const D: WideChar): WideStringArray;
  20601. var I, J, L : Integer;
  20602. begin
  20603. // Check valid parameters
  20604. if S = '' then
  20605. begin
  20606. Result := nil;
  20607. exit;
  20608. end;
  20609. // Count
  20610. L := 0;
  20611. I := 1;
  20612. repeat
  20613. I := PosCharW(D, S, I);
  20614. if I = 0 then
  20615. break;
  20616. Inc(L);
  20617. Inc(I);
  20618. until False;
  20619. SetLength(Result, L + 1);
  20620. if L = 0 then
  20621. begin
  20622. // No split
  20623. Result[0] := S;
  20624. exit;
  20625. end;
  20626. // Split
  20627. L := 0;
  20628. I := 1;
  20629. repeat
  20630. J := PosCharW(D, S, I);
  20631. if J = 0 then
  20632. begin
  20633. Result[L] := CopyFromW(S, I);
  20634. break;
  20635. end;
  20636. Result[L] := CopyRangeW(S, I, J - 1);
  20637. Inc(L);
  20638. I := J + 1;
  20639. until False;
  20640. end;
  20641. function StrSplitCharU(const S: UnicodeString; const D: WideChar): UnicodeStringArray;
  20642. var I, J, L : Integer;
  20643. begin
  20644. // Check valid parameters
  20645. if S = '' then
  20646. begin
  20647. Result := nil;
  20648. exit;
  20649. end;
  20650. // Count
  20651. L := 0;
  20652. I := 1;
  20653. repeat
  20654. I := PosCharU(D, S, I);
  20655. if I = 0 then
  20656. break;
  20657. Inc(L);
  20658. Inc(I);
  20659. until False;
  20660. SetLength(Result, L + 1);
  20661. if L = 0 then
  20662. begin
  20663. // No split
  20664. Result[0] := S;
  20665. exit;
  20666. end;
  20667. // Split
  20668. L := 0;
  20669. I := 1;
  20670. repeat
  20671. J := PosCharU(D, S, I);
  20672. if J = 0 then
  20673. begin
  20674. Result[L] := CopyFromU(S, I);
  20675. break;
  20676. end;
  20677. Result[L] := CopyRangeU(S, I, J - 1);
  20678. Inc(L);
  20679. I := J + 1;
  20680. until False;
  20681. end;
  20682. function StrSplitChar(const S: String; const D: Char): StringArray;
  20683. var I, J, L : Integer;
  20684. begin
  20685. // Check valid parameters
  20686. if S = '' then
  20687. begin
  20688. Result := nil;
  20689. exit;
  20690. end;
  20691. // Count
  20692. L := 0;
  20693. I := 1;
  20694. repeat
  20695. I := PosChar(D, S, I);
  20696. if I = 0 then
  20697. break;
  20698. Inc(L);
  20699. Inc(I);
  20700. until False;
  20701. SetLength(Result, L + 1);
  20702. if L = 0 then
  20703. begin
  20704. // No split
  20705. Result[0] := S;
  20706. exit;
  20707. end;
  20708. // Split
  20709. L := 0;
  20710. I := 1;
  20711. repeat
  20712. J := PosChar(D, S, I);
  20713. if J = 0 then
  20714. begin
  20715. Result[L] := CopyFrom(S, I);
  20716. break;
  20717. end;
  20718. Result[L] := CopyRange(S, I, J - 1);
  20719. Inc(L);
  20720. I := J + 1;
  20721. until False;
  20722. end;
  20723. function StrSplitCharSetA(const S: AnsiString; const D: CharSet): AnsiStringArray;
  20724. var I, J, L : Integer;
  20725. begin
  20726. // Check valid parameters
  20727. if S = '' then
  20728. begin
  20729. Result := nil;
  20730. exit;
  20731. end;
  20732. // Count
  20733. L := 0;
  20734. I := 1;
  20735. repeat
  20736. I := PosCharSetA(D, S, I);
  20737. if I = 0 then
  20738. break;
  20739. Inc(L);
  20740. Inc(I);
  20741. until False;
  20742. SetLength(Result, L + 1);
  20743. if L = 0 then
  20744. begin
  20745. // No split
  20746. Result[0] := S;
  20747. exit;
  20748. end;
  20749. // Split
  20750. L := 0;
  20751. I := 1;
  20752. repeat
  20753. J := PosCharSetA(D, S, I);
  20754. if J = 0 then
  20755. begin
  20756. Result[L] := CopyFromA(S, I);
  20757. break;
  20758. end;
  20759. Result[L] := CopyRangeA(S, I, J - 1);
  20760. Inc(L);
  20761. I := J + 1;
  20762. until False;
  20763. end;
  20764. function StrSplitCharSetW(const S: WideString; const D: CharSet): WideStringArray;
  20765. var I, J, L : Integer;
  20766. begin
  20767. // Check valid parameters
  20768. if S = '' then
  20769. begin
  20770. Result := nil;
  20771. exit;
  20772. end;
  20773. // Count
  20774. L := 0;
  20775. I := 1;
  20776. repeat
  20777. I := PosCharSetW(D, S, I);
  20778. if I = 0 then
  20779. break;
  20780. Inc(L);
  20781. Inc(I);
  20782. until False;
  20783. SetLength(Result, L + 1);
  20784. if L = 0 then
  20785. begin
  20786. // No split
  20787. Result[0] := S;
  20788. exit;
  20789. end;
  20790. // Split
  20791. L := 0;
  20792. I := 1;
  20793. repeat
  20794. J := PosCharSetW(D, S, I);
  20795. if J = 0 then
  20796. begin
  20797. Result[L] := CopyFromW(S, I);
  20798. break;
  20799. end;
  20800. Result[L] := CopyRangeW(S, I, J - 1);
  20801. Inc(L);
  20802. I := J + 1;
  20803. until False;
  20804. end;
  20805. function StrSplitCharSetU(const S: UnicodeString; const D: CharSet): UnicodeStringArray;
  20806. var I, J, L : Integer;
  20807. begin
  20808. // Check valid parameters
  20809. if S = '' then
  20810. begin
  20811. Result := nil;
  20812. exit;
  20813. end;
  20814. // Count
  20815. L := 0;
  20816. I := 1;
  20817. repeat
  20818. I := PosCharSetU(D, S, I);
  20819. if I = 0 then
  20820. break;
  20821. Inc(L);
  20822. Inc(I);
  20823. until False;
  20824. SetLength(Result, L + 1);
  20825. if L = 0 then
  20826. begin
  20827. // No split
  20828. Result[0] := S;
  20829. exit;
  20830. end;
  20831. // Split
  20832. L := 0;
  20833. I := 1;
  20834. repeat
  20835. J := PosCharSetU(D, S, I);
  20836. if J = 0 then
  20837. begin
  20838. Result[L] := CopyFromU(S, I);
  20839. break;
  20840. end;
  20841. Result[L] := CopyRangeU(S, I, J - 1);
  20842. Inc(L);
  20843. I := J + 1;
  20844. until False;
  20845. end;
  20846. function StrSplitCharSet(const S: String; const D: CharSet): StringArray;
  20847. var I, J, L : Integer;
  20848. begin
  20849. // Check valid parameters
  20850. if S = '' then
  20851. begin
  20852. Result := nil;
  20853. exit;
  20854. end;
  20855. // Count
  20856. L := 0;
  20857. I := 1;
  20858. repeat
  20859. I := PosCharSet(D, S, I);
  20860. if I = 0 then
  20861. break;
  20862. Inc(L);
  20863. Inc(I);
  20864. until False;
  20865. SetLength(Result, L + 1);
  20866. if L = 0 then
  20867. begin
  20868. // No split
  20869. Result[0] := S;
  20870. exit;
  20871. end;
  20872. // Split
  20873. L := 0;
  20874. I := 1;
  20875. repeat
  20876. J := PosCharSet(D, S, I);
  20877. if J = 0 then
  20878. begin
  20879. Result[L] := CopyFrom(S, I);
  20880. break;
  20881. end;
  20882. Result[L] := CopyRange(S, I, J - 1);
  20883. Inc(L);
  20884. I := J + 1;
  20885. until False;
  20886. end;
  20887. {$IFNDEF CLR}
  20888. function StrSplitWords(const S: AnsiString; const C: CharSet): AnsiStringArray;
  20889. var P, Q : PAnsiChar;
  20890. L, M : Integer;
  20891. N : Integer;
  20892. T : AnsiString;
  20893. begin
  20894. Result := nil;
  20895. L := Length(S);
  20896. P := Pointer(S);
  20897. Q := P;
  20898. M := 0;
  20899. N := 0;
  20900. while L > 0 do
  20901. if P^ in C then
  20902. begin
  20903. Inc(P);
  20904. Dec(L);
  20905. Inc(M);
  20906. end else
  20907. begin
  20908. if M > 0 then
  20909. begin
  20910. SetLength(T, M);
  20911. MoveMem(Q^, Pointer(T)^, M);
  20912. SetLength(Result, N + 1);
  20913. Result[N] := T;
  20914. Inc(N);
  20915. end;
  20916. M := 0;
  20917. Inc(P);
  20918. Dec(L);
  20919. Q := P;
  20920. end;
  20921. if M > 0 then
  20922. begin
  20923. SetLength(T, M);
  20924. MoveMem(Q^, Pointer(T)^, M);
  20925. SetLength(Result, N + 1);
  20926. Result[N] := T;
  20927. end;
  20928. end;
  20929. {$ENDIF}
  20930. {$IFDEF CLR}
  20931. function StrJoin(const S: array of AnsiString; const D: AnsiString): AnsiString;
  20932. var L, I : Integer;
  20933. begin
  20934. Result := '';
  20935. L := Length(S);
  20936. if L = 0 then
  20937. exit;
  20938. for I := 0 to L - 1 do
  20939. begin
  20940. Result := Result + S[I];
  20941. if I < L - 1 then
  20942. Result := Result + D;
  20943. end;
  20944. end;
  20945. {$ELSE}
  20946. function StrJoinA(const S: array of AnsiString; const D: AnsiString): AnsiString;
  20947. var I, L, M, C : Integer;
  20948. P : PAnsiChar;
  20949. T : AnsiString;
  20950. begin
  20951. L := Length(S);
  20952. if L = 0 then
  20953. begin
  20954. Result := '';
  20955. exit;
  20956. end;
  20957. M := Length(D);
  20958. SetLength(Result, StringsTotalLengthA(S) + (L - 1) * M);
  20959. P := Pointer(Result);
  20960. for I := 0 to L - 1 do
  20961. begin
  20962. if (I > 0) and (M > 0) then
  20963. begin
  20964. MoveMem(Pointer(D)^, P^, M);
  20965. Inc(P, M);
  20966. end;
  20967. T := S[I];
  20968. C := Length(T);
  20969. if C > 0 then
  20970. begin
  20971. MoveMem(Pointer(T)^, P^, C);
  20972. Inc(P, C);
  20973. end;
  20974. end;
  20975. end;
  20976. function StrJoinW(const S: array of WideString; const D: WideString): WideString;
  20977. var I, L, M, C : Integer;
  20978. P : PWideChar;
  20979. T : WideString;
  20980. begin
  20981. L := Length(S);
  20982. if L = 0 then
  20983. begin
  20984. Result := '';
  20985. exit;
  20986. end;
  20987. M := Length(D);
  20988. SetLength(Result, StringsTotalLengthW(S) + (L - 1) * M);
  20989. P := Pointer(Result);
  20990. for I := 0 to L - 1 do
  20991. begin
  20992. if (I > 0) and (M > 0) then
  20993. begin
  20994. MoveMem(Pointer(D)^, P^, M * SizeOf(WideChar));
  20995. Inc(P, M);
  20996. end;
  20997. T := S[I];
  20998. C := Length(T);
  20999. if C > 0 then
  21000. begin
  21001. MoveMem(Pointer(T)^, P^, C * SizeOf(WideChar));
  21002. Inc(P, C);
  21003. end;
  21004. end;
  21005. end;
  21006. function StrJoinU(const S: array of UnicodeString; const D: UnicodeString): UnicodeString;
  21007. var I, L, M, C : Integer;
  21008. P : PWideChar;
  21009. T : UnicodeString;
  21010. begin
  21011. L := Length(S);
  21012. if L = 0 then
  21013. begin
  21014. Result := '';
  21015. exit;
  21016. end;
  21017. M := Length(D);
  21018. SetLength(Result, StringsTotalLengthU(S) + (L - 1) * M);
  21019. P := Pointer(Result);
  21020. for I := 0 to L - 1 do
  21021. begin
  21022. if (I > 0) and (M > 0) then
  21023. begin
  21024. MoveMem(Pointer(D)^, P^, M * SizeOf(WideChar));
  21025. Inc(P, M);
  21026. end;
  21027. T := S[I];
  21028. C := Length(T);
  21029. if C > 0 then
  21030. begin
  21031. MoveMem(Pointer(T)^, P^, C * SizeOf(WideChar));
  21032. Inc(P, C);
  21033. end;
  21034. end;
  21035. end;
  21036. function StrJoin(const S: array of String; const D: String): String;
  21037. var I, L, M, C : Integer;
  21038. P : PChar;
  21039. T : String;
  21040. begin
  21041. L := Length(S);
  21042. if L = 0 then
  21043. begin
  21044. Result := '';
  21045. exit;
  21046. end;
  21047. M := Length(D);
  21048. SetLength(Result, StringsTotalLength(S) + (L - 1) * M);
  21049. P := Pointer(Result);
  21050. for I := 0 to L - 1 do
  21051. begin
  21052. if (I > 0) and (M > 0) then
  21053. begin
  21054. MoveMem(Pointer(D)^, P^, M * SizeOf(Char));
  21055. Inc(P, M);
  21056. end;
  21057. T := S[I];
  21058. C := Length(T);
  21059. if C > 0 then
  21060. begin
  21061. MoveMem(Pointer(T)^, P^, C * SizeOf(Char));
  21062. Inc(P, C);
  21063. end;
  21064. end;
  21065. end;
  21066. {$ENDIF}
  21067. {$IFDEF CLR}
  21068. function StrJoinChar(const S: array of AnsiString; const D: AnsiChar): AnsiString;
  21069. var L, I : Integer;
  21070. begin
  21071. Result := '';
  21072. L := Length(S);
  21073. if L = 0 then
  21074. exit;
  21075. for I := 0 to L - 1 do
  21076. begin
  21077. Result := Result + S[I];
  21078. if I < L - 1 then
  21079. Result := Result + D;
  21080. end;
  21081. end;
  21082. {$ELSE}
  21083. function StrJoinCharA(const S: array of AnsiString; const D: AnsiChar): AnsiString;
  21084. var I, L, C : Integer;
  21085. P : PAnsiChar;
  21086. T : AnsiString;
  21087. begin
  21088. L := Length(S);
  21089. if L = 0 then
  21090. begin
  21091. Result := '';
  21092. exit;
  21093. end;
  21094. SetLength(Result, StringsTotalLengthA(S) + L - 1);
  21095. P := Pointer(Result);
  21096. for I := 0 to L - 1 do
  21097. begin
  21098. if I > 0 then
  21099. begin
  21100. P^ := D;
  21101. Inc(P);
  21102. end;
  21103. T := S[I];
  21104. C := Length(T);
  21105. if C > 0 then
  21106. begin
  21107. MoveMem(Pointer(T)^, P^, C);
  21108. Inc(P, C);
  21109. end;
  21110. end;
  21111. end;
  21112. function StrJoinCharW(const S: array of WideString; const D: WideChar): WideString;
  21113. var I, L, C : Integer;
  21114. P : PWideChar;
  21115. T : WideString;
  21116. begin
  21117. L := Length(S);
  21118. if L = 0 then
  21119. begin
  21120. Result := '';
  21121. exit;
  21122. end;
  21123. SetLength(Result, StringsTotalLengthW(S) + L - 1);
  21124. P := Pointer(Result);
  21125. for I := 0 to L - 1 do
  21126. begin
  21127. if I > 0 then
  21128. begin
  21129. P^ := D;
  21130. Inc(P);
  21131. end;
  21132. T := S[I];
  21133. C := Length(T);
  21134. if C > 0 then
  21135. begin
  21136. MoveMem(Pointer(T)^, P^, C * SizeOf(WideChar));
  21137. Inc(P, C);
  21138. end;
  21139. end;
  21140. end;
  21141. function StrJoinCharU(const S: array of UnicodeString; const D: WideChar): UnicodeString;
  21142. var I, L, C : Integer;
  21143. P : PWideChar;
  21144. T : UnicodeString;
  21145. begin
  21146. L := Length(S);
  21147. if L = 0 then
  21148. begin
  21149. Result := '';
  21150. exit;
  21151. end;
  21152. SetLength(Result, StringsTotalLengthU(S) + L - 1);
  21153. P := Pointer(Result);
  21154. for I := 0 to L - 1 do
  21155. begin
  21156. if I > 0 then
  21157. begin
  21158. P^ := D;
  21159. Inc(P);
  21160. end;
  21161. T := S[I];
  21162. C := Length(T);
  21163. if C > 0 then
  21164. begin
  21165. MoveMem(Pointer(T)^, P^, C * SizeOf(WideChar));
  21166. Inc(P, C);
  21167. end;
  21168. end;
  21169. end;
  21170. function StrJoinChar(const S: array of String; const D: Char): String;
  21171. var I, L, C : Integer;
  21172. P : PChar;
  21173. T : String;
  21174. begin
  21175. L := Length(S);
  21176. if L = 0 then
  21177. begin
  21178. Result := '';
  21179. exit;
  21180. end;
  21181. SetLength(Result, StringsTotalLength(S) + L - 1);
  21182. P := Pointer(Result);
  21183. for I := 0 to L - 1 do
  21184. begin
  21185. if I > 0 then
  21186. begin
  21187. P^ := D;
  21188. Inc(P);
  21189. end;
  21190. T := S[I];
  21191. C := Length(T);
  21192. if C > 0 then
  21193. begin
  21194. MoveMem(Pointer(T)^, P^, C * SizeOf(Char));
  21195. Inc(P, C);
  21196. end;
  21197. end;
  21198. end;
  21199. {$ENDIF}
  21200. { }
  21201. { Quoting }
  21202. { }
  21203. {$IFDEF CLR}
  21204. function StrHasSurroundingQuotes(const S: AnsiString; const Quotes: CharSet): Boolean;
  21205. var Q : AnsiChar;
  21206. L : Integer;
  21207. begin
  21208. Result := False;
  21209. L := Length(S);
  21210. if L >= 2 then
  21211. begin
  21212. Q := S[1];
  21213. if Q in Quotes then
  21214. if S[L] = Q then
  21215. Result := True;
  21216. end;
  21217. end;
  21218. {$ElSE}
  21219. function StrHasSurroundingQuotesA(const S: AnsiString; const Quotes: CharSet): Boolean;
  21220. var P : PAnsiChar;
  21221. Q : AnsiChar;
  21222. L : Integer;
  21223. begin
  21224. Result := False;
  21225. L := Length(S);
  21226. if L >= 2 then
  21227. begin
  21228. P := Pointer(S);
  21229. Q := P^;
  21230. if Q in Quotes then
  21231. begin
  21232. Inc(P, L - 1);
  21233. if P^ = Q then
  21234. Result := True;
  21235. end;
  21236. end;
  21237. end;
  21238. function StrHasSurroundingQuotesW(const S: WideString; const Quotes: CharSet): Boolean;
  21239. var P : PWideChar;
  21240. Q : WideChar;
  21241. L : Integer;
  21242. begin
  21243. Result := False;
  21244. L := Length(S);
  21245. if L >= 2 then
  21246. begin
  21247. P := Pointer(S);
  21248. Q := P^;
  21249. if WideCharInCharSet(Q, Quotes) then
  21250. begin
  21251. Inc(P, L - 1);
  21252. if P^ = Q then
  21253. Result := True;
  21254. end;
  21255. end;
  21256. end;
  21257. function StrHasSurroundingQuotesU(const S: UnicodeString; const Quotes: CharSet): Boolean;
  21258. var P : PWideChar;
  21259. Q : WideChar;
  21260. L : Integer;
  21261. begin
  21262. Result := False;
  21263. L := Length(S);
  21264. if L >= 2 then
  21265. begin
  21266. P := Pointer(S);
  21267. Q := P^;
  21268. if WideCharInCharSet(Q, Quotes) then
  21269. begin
  21270. Inc(P, L - 1);
  21271. if P^ = Q then
  21272. Result := True;
  21273. end;
  21274. end;
  21275. end;
  21276. function StrHasSurroundingQuotes(const S: String; const Quotes: CharSet): Boolean;
  21277. var P : PChar;
  21278. Q : Char;
  21279. L : Integer;
  21280. begin
  21281. Result := False;
  21282. L := Length(S);
  21283. if L >= 2 then
  21284. begin
  21285. P := Pointer(S);
  21286. Q := P^;
  21287. {$IFDEF CharIsWide}
  21288. if Ord(Q) <= $FF then
  21289. {$ENDIF}
  21290. if AnsiChar(Byte(Q)) in Quotes then
  21291. begin
  21292. Inc(P, L - 1);
  21293. if P^ = Q then
  21294. Result := True;
  21295. end;
  21296. end;
  21297. end;
  21298. {$ENDIF}
  21299. function StrRemoveSurroundingQuotesA(const S: AnsiString; const Quotes: CharSet): AnsiString;
  21300. begin
  21301. if StrHasSurroundingQuotesA(S, Quotes) then
  21302. Result := Copy(S, 2, Length(S) - 2)
  21303. else
  21304. Result := S;
  21305. end;
  21306. function StrRemoveSurroundingQuotesW(const S: WideString; const Quotes: CharSet): WideString;
  21307. begin
  21308. if StrHasSurroundingQuotesW(S, Quotes) then
  21309. Result := Copy(S, 2, Length(S) - 2)
  21310. else
  21311. Result := S;
  21312. end;
  21313. function StrRemoveSurroundingQuotesU(const S: UnicodeString; const Quotes: CharSet): UnicodeString;
  21314. begin
  21315. if StrHasSurroundingQuotesU(S, Quotes) then
  21316. Result := Copy(S, 2, Length(S) - 2)
  21317. else
  21318. Result := S;
  21319. end;
  21320. function StrRemoveSurroundingQuotes(const S: String; const Quotes: CharSet): String;
  21321. begin
  21322. if StrHasSurroundingQuotes(S, Quotes) then
  21323. Result := Copy(S, 2, Length(S) - 2)
  21324. else
  21325. Result := S;
  21326. end;
  21327. function StrQuoteA(const S: AnsiString; const Quote: AnsiChar): AnsiString;
  21328. begin
  21329. Result := Quote + StrReplaceA(Quote, DupCharA(Quote, 2), S) + Quote;
  21330. end;
  21331. function StrQuoteW(const S: WideString; const Quote: WideChar): WideString;
  21332. begin
  21333. Result := Quote + StrReplaceW(Quote, DupCharW(Quote, 2), S) + Quote;
  21334. end;
  21335. function StrQuoteU(const S: UnicodeString; const Quote: WideChar): UnicodeString;
  21336. begin
  21337. Result := Quote + StrReplaceU(Quote, DupCharU(Quote, 2), S) + Quote;
  21338. end;
  21339. function StrQuote(const S: String; const Quote: Char): String;
  21340. begin
  21341. Result := Quote + StrReplace(Quote, DupChar(Quote, 2), S) + Quote;
  21342. end;
  21343. function StrUnquoteA(const S: AnsiString): AnsiString;
  21344. var Quote : AnsiChar;
  21345. begin
  21346. if not StrHasSurroundingQuotesA(S, csQuotes) then
  21347. begin
  21348. Result := S;
  21349. exit;
  21350. end;
  21351. Quote := S[1];
  21352. Result := StrRemoveSurroundingQuotesA(S, csQuotes);
  21353. Result := StrReplaceA(DupCharA(Quote, 2), Quote, Result);
  21354. end;
  21355. function StrUnquoteW(const S: WideString): WideString;
  21356. var Quote : WideChar;
  21357. begin
  21358. if not StrHasSurroundingQuotesW(S, csQuotes) then
  21359. begin
  21360. Result := S;
  21361. exit;
  21362. end;
  21363. Quote := S[1];
  21364. Result := StrRemoveSurroundingQuotesW(S, csQuotes);
  21365. Result := StrReplaceW(DupCharW(Quote, 2), Quote, Result);
  21366. end;
  21367. function StrUnquoteU(const S: UnicodeString): UnicodeString;
  21368. var Quote : WideChar;
  21369. begin
  21370. if not StrHasSurroundingQuotesU(S, csQuotes) then
  21371. begin
  21372. Result := S;
  21373. exit;
  21374. end;
  21375. Quote := S[1];
  21376. Result := StrRemoveSurroundingQuotesU(S, csQuotes);
  21377. Result := StrReplaceU(DupCharW(Quote, 2), Quote, Result);
  21378. end;
  21379. function StrUnquote(const S: String): String;
  21380. var Quote : Char;
  21381. begin
  21382. if not StrHasSurroundingQuotes(S, csQuotes) then
  21383. begin
  21384. Result := S;
  21385. exit;
  21386. end;
  21387. Quote := S[1];
  21388. Result := StrRemoveSurroundingQuotes(S, csQuotes);
  21389. Result := StrReplace(DupChar(Quote, 2), Quote, Result);
  21390. end;
  21391. function StrMatchQuotedStrA(const S: AnsiString; const ValidQuotes: CharSet;
  21392. const Index: Integer): Integer;
  21393. var Quote : AnsiChar;
  21394. I, L : Integer;
  21395. R : Boolean;
  21396. begin
  21397. L := Length(S);
  21398. if (Index < 1) or (L < Index + 1) or not (S[Index] in ValidQuotes) then
  21399. begin
  21400. Result := 0;
  21401. exit;
  21402. end;
  21403. Quote := S[Index];
  21404. I := Index + 1;
  21405. R := False;
  21406. repeat
  21407. I := PosCharA(Quote, S, I);
  21408. if I = 0 then // no closing quote
  21409. begin
  21410. Result := 0;
  21411. exit;
  21412. end else
  21413. if I = L then // closing quote is last character
  21414. R := True else
  21415. if S[I + 1] <> Quote then // not double quoted
  21416. R := True
  21417. else
  21418. Inc(I, 2);
  21419. until R;
  21420. Result := I - Index + 1;
  21421. end;
  21422. function StrIsQuotedStrA(const S: AnsiString; const ValidQuotes: CharSet): Boolean;
  21423. var L : Integer;
  21424. begin
  21425. L := Length(S);
  21426. if (L < 2) or (S[1] <> S[L]) or not (S[1] in ValidQuotes) then
  21427. Result := False
  21428. else
  21429. Result := StrMatchQuotedStrA(S, ValidQuotes) = L;
  21430. end;
  21431. function StrFindClosingQuoteA(const S: AnsiString; const OpenQuotePos: Integer): Integer;
  21432. var I : Integer;
  21433. OpenQuote : AnsiChar;
  21434. R : Boolean;
  21435. begin
  21436. if (OpenQuotePos <= 0) or (OpenQuotePos > Length(S)) then
  21437. begin
  21438. Result := 0;
  21439. exit;
  21440. end;
  21441. I := OpenQuotePos;
  21442. OpenQuote := S[I];
  21443. repeat
  21444. I := PosCharA(OpenQuote, S, I + 1);
  21445. if I = 0 then
  21446. begin
  21447. Result := 0;
  21448. exit;
  21449. end;
  21450. R := (I = Length(S)) or (S[I + 1] <> OpenQuote);
  21451. if not R then
  21452. Inc(I);
  21453. until R;
  21454. Result := I;
  21455. end;
  21456. { }
  21457. { Bracketing }
  21458. { }
  21459. function StrFindClosingBracketA(const S: AnsiString;
  21460. const OpenBracketPos: Integer; const CloseBracket: AnsiChar): Integer;
  21461. var OpenBracket : AnsiChar;
  21462. Brackets : CharSet;
  21463. I, C : Integer;
  21464. begin
  21465. Result := 0;
  21466. I := OpenBracketPos;
  21467. if (I <= 0) or (I > Length(S)) then
  21468. exit;
  21469. OpenBracket := S[OpenBracketPos];
  21470. Brackets := [OpenBracket, CloseBracket];
  21471. C := 1;
  21472. repeat
  21473. I := PosCharSetA(Brackets, S, I + 1);
  21474. if I = 0 then
  21475. exit;
  21476. if S[I] = OpenBracket then
  21477. Inc(C)
  21478. else
  21479. Dec(C);
  21480. until C = 0;
  21481. Result := I;
  21482. end;
  21483. { }
  21484. { Escaping }
  21485. { }
  21486. function StrHexEscape(const S: AnsiString; const C: CharSet;
  21487. const EscPrefix: AnsiString; const EscSuffix: AnsiString;
  21488. const UpperHex: Boolean; const TwoDigitHex: Boolean): AnsiString;
  21489. var I, J : Integer;
  21490. HexStr : AnsiString;
  21491. begin
  21492. Result := '';
  21493. J := 1;
  21494. I := PosCharSetA(C, S);
  21495. while I > 0 do
  21496. begin
  21497. if TwoDigitHex then
  21498. HexStr := LongWordToHexA(Ord(S[I]), 2)
  21499. else
  21500. HexStr := LongWordToHexA(Ord(S[I]), 1);
  21501. if UpperHex then
  21502. AsciiConvertUpperA(HexStr)
  21503. else
  21504. AsciiConvertLowerA(HexStr);
  21505. Result := Result + CopyRangeA(S, J, I - 1) +
  21506. EscPrefix + HexStr + EscSuffix;
  21507. J := I + 1;
  21508. I := PosCharSetA(C, S, J);
  21509. end;
  21510. if J = 1 then
  21511. Result := S
  21512. else
  21513. Result := Result + CopyFromA(S, J);
  21514. end;
  21515. function StrHexUnescape(const S: AnsiString; const EscPrefix: AnsiString;
  21516. const AsciiCaseSensitive: Boolean): AnsiString;
  21517. var I, J, L, M : Integer;
  21518. V : Byte;
  21519. begin
  21520. Result := '';
  21521. L := Length(S);
  21522. if L = 0 then
  21523. exit;
  21524. M := Length(EscPrefix);
  21525. if M = 0 then
  21526. exit;
  21527. // Replace
  21528. J := 1;
  21529. repeat
  21530. I := PosStrA(EscPrefix, S, J, AsciiCaseSensitive);
  21531. if I > 0 then
  21532. begin
  21533. Result := Result + CopyRangeA(S, J, I - 1);
  21534. Inc(I, M);
  21535. if (I <= L) and IsHexAnsiChar(S[I]) then
  21536. begin
  21537. if (I < L) and IsHexAnsiChar(S[I + 1]) then
  21538. begin
  21539. V := HexAnsiCharToInt(S[I]) * 16 + HexAnsiCharToInt(S[I + 1]);
  21540. Inc(I, 2);
  21541. end else
  21542. begin
  21543. V := HexAnsiCharToInt(S[I]);
  21544. Inc(I);
  21545. end;
  21546. Result := Result + AnsiChar(V);
  21547. end;
  21548. J := I;
  21549. end;
  21550. until I = 0;
  21551. if (I = 0) and (J = 0) then
  21552. Result := S
  21553. else
  21554. Result := Result + CopyFromA(S, J);
  21555. end;
  21556. function StrCharEscape(const S: AnsiString; const C: array of AnsiChar;
  21557. const EscPrefix: AnsiString; const EscSeq: array of AnsiString): AnsiString;
  21558. var I, J, L : Integer;
  21559. F : CharSet;
  21560. T : AnsiChar;
  21561. Lookup : Array[AnsiChar] of Integer;
  21562. begin
  21563. L := Length(C);
  21564. if L = 0 then
  21565. begin
  21566. Result := S;
  21567. exit;
  21568. end;
  21569. if L <> Length(EscSeq) then
  21570. raise EStrInvalidArgument.Create('Invalid arguments');
  21571. // Initialize lookup
  21572. {$IFDEF CLR}
  21573. for T := #0 to #255 do
  21574. Lookup[T] := 0;
  21575. {$ELSE}
  21576. ZeroMem(Lookup, Sizeof(Lookup));
  21577. {$ENDIF}
  21578. F := [];
  21579. for I := 0 to Length(C) - 1 do
  21580. begin
  21581. T := C[I];
  21582. Include(F, T);
  21583. Lookup[T] := I;
  21584. end;
  21585. // Replace
  21586. Result := '';
  21587. J := 1;
  21588. I := PosCharSetA(F, S);
  21589. while I > 0 do
  21590. begin
  21591. Result := Result + CopyRangeA(S, J, I - 1) +
  21592. EscPrefix + EscSeq[Lookup[S[I]]];
  21593. J := I + 1;
  21594. I := PosCharSetA(F, S, J);
  21595. end;
  21596. if J = 1 then
  21597. Result := S
  21598. else
  21599. Result := Result + CopyFromA(S, J);
  21600. end;
  21601. function StrCharUnescape(const S: AnsiString; const EscPrefix: AnsiString;
  21602. const C: array of AnsiChar; const Replace: array of AnsiString;
  21603. const PrefixAsciiCaseSensitive: Boolean; const
  21604. AlwaysDropPrefix: Boolean): AnsiString;
  21605. var I, J, L : Integer;
  21606. F, G, M : Integer;
  21607. D : AnsiChar;
  21608. begin
  21609. if High(C) <> High(Replace) then
  21610. raise EStrInvalidArgument.Create('Invalid arguments');
  21611. L := Length(EscPrefix);
  21612. M := Length(S);
  21613. if (L = 0) or (M <= L) then
  21614. begin
  21615. Result := S;
  21616. exit;
  21617. end;
  21618. // Replace
  21619. Result := '';
  21620. J := 1;
  21621. repeat
  21622. I := PosStrA(EscPrefix, S, J, PrefixAsciiCaseSensitive);
  21623. if I > 0 then
  21624. begin
  21625. G := -1;
  21626. if I < Length(S) then
  21627. begin
  21628. D := S[I + L];
  21629. for F := 0 to High(C) do
  21630. if C[F] = D then
  21631. begin
  21632. G := F;
  21633. break;
  21634. end;
  21635. end;
  21636. Result := Result + CopyRangeA(S, J, I - 1);
  21637. if G >= 0 then
  21638. Result := Result + Replace[G] else
  21639. if not AlwaysDropPrefix then
  21640. Result := Result + EscPrefix;
  21641. J := I + L + 1;
  21642. end;
  21643. until I = 0;
  21644. if (I = 0) and (J = 0) then
  21645. Result := S
  21646. else
  21647. Result := Result + CopyFromA(S, J);
  21648. end;
  21649. function StrCStyleEscape(const S: AnsiString): AnsiString;
  21650. begin
  21651. Result := StrCharEscape(S,
  21652. [AsciiCR, AsciiLF, AsciiNULL, AsciiBEL, AsciiBS, AsciiESC, AsciiHT,
  21653. AsciiFF, AsciiVT, '\'], '\',
  21654. ['n', 'l', '0', 'a', 'b', 'e', 't',
  21655. 'f', 'v', '\']);
  21656. end;
  21657. function StrCStyleUnescape(const S: AnsiString): AnsiString;
  21658. begin
  21659. Result := StrCharUnescape(S, '\',
  21660. ['n', 'l', '0', 'a', 'b', 'e', 't',
  21661. 'f', 'v', '\', '''', '"', '?'],
  21662. [AsciiCR, AsciiLF, AsciiNULL, AsciiBEL, AsciiBS, AsciiESC, AsciiHT,
  21663. AsciiFF, AsciiVT, '\', '''', '"', '?'], True, False);
  21664. Result := StrHexUnescape(Result, '\x', True);
  21665. end;
  21666. { }
  21667. { Prefix and Suffix }
  21668. { }
  21669. function StrInclPrefixA(const S: AnsiString; const Prefix: AnsiString;
  21670. const AsciiCaseSensitive: Boolean): AnsiString;
  21671. begin
  21672. if not StrMatchLeftA(S, Prefix, AsciiCaseSensitive) then
  21673. Result := Prefix + S
  21674. else
  21675. Result := S;
  21676. end;
  21677. function StrInclPrefixW(const S: WideString; const Prefix: WideString;
  21678. const AsciiCaseSensitive: Boolean): WideString;
  21679. begin
  21680. if not StrMatchLeftW(S, Prefix, AsciiCaseSensitive) then
  21681. Result := Prefix + S
  21682. else
  21683. Result := S;
  21684. end;
  21685. function StrInclPrefixU(const S: UnicodeString; const Prefix: UnicodeString;
  21686. const AsciiCaseSensitive: Boolean): UnicodeString;
  21687. begin
  21688. if not StrMatchLeftU(S, Prefix, AsciiCaseSensitive) then
  21689. Result := Prefix + S
  21690. else
  21691. Result := S;
  21692. end;
  21693. function StrInclPrefix(const S: String; const Prefix: String;
  21694. const AsciiCaseSensitive: Boolean): String;
  21695. begin
  21696. if not StrMatchLeft(S, Prefix, AsciiCaseSensitive) then
  21697. Result := Prefix + S
  21698. else
  21699. Result := S;
  21700. end;
  21701. function StrInclSuffixA(const S: AnsiString; const Suffix: AnsiString;
  21702. const AsciiCaseSensitive: Boolean): AnsiString;
  21703. begin
  21704. if not StrMatchRightA(S, Suffix, AsciiCaseSensitive) then
  21705. Result := S + Suffix
  21706. else
  21707. Result := S;
  21708. end;
  21709. function StrInclSuffixW(const S: WideString; const Suffix: WideString;
  21710. const AsciiCaseSensitive: Boolean): WideString;
  21711. begin
  21712. if not StrMatchRightW(S, Suffix, AsciiCaseSensitive) then
  21713. Result := S + Suffix
  21714. else
  21715. Result := S;
  21716. end;
  21717. function StrInclSuffixU(const S: UnicodeString; const Suffix: UnicodeString;
  21718. const AsciiCaseSensitive: Boolean): UnicodeString;
  21719. begin
  21720. if not StrMatchRightU(S, Suffix, AsciiCaseSensitive) then
  21721. Result := S + Suffix
  21722. else
  21723. Result := S;
  21724. end;
  21725. function StrInclSuffix(const S: String; const Suffix: String;
  21726. const AsciiCaseSensitive: Boolean): String;
  21727. begin
  21728. if not StrMatchRight(S, Suffix, AsciiCaseSensitive) then
  21729. Result := S + Suffix
  21730. else
  21731. Result := S;
  21732. end;
  21733. function StrExclPrefixA(const S: AnsiString; const Prefix: AnsiString;
  21734. const AsciiCaseSensitive: Boolean): AnsiString;
  21735. begin
  21736. if StrMatchLeftA(S, Prefix, AsciiCaseSensitive) then
  21737. Result := CopyFromA(S, Length(Prefix) + 1)
  21738. else
  21739. Result := S;
  21740. end;
  21741. function StrExclPrefixW(const S: WideString; const Prefix: WideString;
  21742. const AsciiCaseSensitive: Boolean): WideString;
  21743. begin
  21744. if StrMatchLeftW(S, Prefix, AsciiCaseSensitive) then
  21745. Result := CopyFromW(S, Length(Prefix) + 1)
  21746. else
  21747. Result := S;
  21748. end;
  21749. function StrExclPrefixU(const S: UnicodeString; const Prefix: UnicodeString;
  21750. const AsciiCaseSensitive: Boolean): UnicodeString;
  21751. begin
  21752. if StrMatchLeftU(S, Prefix, AsciiCaseSensitive) then
  21753. Result := CopyFromU(S, Length(Prefix) + 1)
  21754. else
  21755. Result := S;
  21756. end;
  21757. function StrExclPrefix(const S: String; const Prefix: String;
  21758. const AsciiCaseSensitive: Boolean): String;
  21759. begin
  21760. if StrMatchLeft(S, Prefix, AsciiCaseSensitive) then
  21761. Result := CopyFrom(S, Length(Prefix) + 1)
  21762. else
  21763. Result := S;
  21764. end;
  21765. function StrExclSuffixA(const S: AnsiString; const Suffix: AnsiString;
  21766. const AsciiCaseSensitive: Boolean): AnsiString;
  21767. begin
  21768. if StrMatchRightA(S, Suffix, AsciiCaseSensitive) then
  21769. Result := Copy(S, 1, Length(S) - Length(Suffix))
  21770. else
  21771. Result := S;
  21772. end;
  21773. function StrExclSuffixW(const S: WideString; const Suffix: WideString;
  21774. const AsciiCaseSensitive: Boolean): WideString;
  21775. begin
  21776. if StrMatchRightW(S, Suffix, AsciiCaseSensitive) then
  21777. Result := Copy(S, 1, Length(S) - Length(Suffix))
  21778. else
  21779. Result := S;
  21780. end;
  21781. function StrExclSuffixU(const S: UnicodeString; const Suffix: UnicodeString;
  21782. const AsciiCaseSensitive: Boolean): UnicodeString;
  21783. begin
  21784. if StrMatchRightU(S, Suffix, AsciiCaseSensitive) then
  21785. Result := Copy(S, 1, Length(S) - Length(Suffix))
  21786. else
  21787. Result := S;
  21788. end;
  21789. function StrExclSuffix(const S: String; const Suffix: String;
  21790. const AsciiCaseSensitive: Boolean): String;
  21791. begin
  21792. if StrMatchRight(S, Suffix, AsciiCaseSensitive) then
  21793. Result := Copy(S, 1, Length(S) - Length(Suffix))
  21794. else
  21795. Result := S;
  21796. end;
  21797. {$IFDEF CLR}
  21798. procedure StrEnsurePrefixA(var S: AnsiString; const Prefix: AnsiString;
  21799. const AsciiCaseSensitive: Boolean);
  21800. begin
  21801. if (Prefix <> '') and not StrMatchLeftA(S, Prefix, AsciiCaseSensitive) then
  21802. S := Prefix + S;
  21803. end;
  21804. {$ELSE}
  21805. procedure StrEnsurePrefixA(var S: AnsiString; const Prefix: AnsiString;
  21806. const AsciiCaseSensitive: Boolean);
  21807. var L, M : Integer;
  21808. P : PAnsiChar;
  21809. begin
  21810. if (Prefix <> '') and not StrMatchLeftA(S, Prefix, AsciiCaseSensitive) then
  21811. begin
  21812. L := Length(S);
  21813. M := Length(Prefix);
  21814. SetLength(S, L + M);
  21815. if L > 0 then
  21816. begin
  21817. P := Pointer(S);
  21818. Inc(P, M);
  21819. MoveMem(Pointer(S)^, P^, L);
  21820. end;
  21821. MoveMem(Pointer(Prefix)^, Pointer(S)^, M);
  21822. end;
  21823. end;
  21824. procedure StrEnsurePrefixW(var S: WideString; const Prefix: WideString;
  21825. const AsciiCaseSensitive: Boolean);
  21826. begin
  21827. if (Prefix <> '') and not StrMatchLeftW(S, Prefix, AsciiCaseSensitive) then
  21828. S := Prefix + S;
  21829. end;
  21830. procedure StrEnsurePrefixU(var S: UnicodeString; const Prefix: UnicodeString;
  21831. const AsciiCaseSensitive: Boolean);
  21832. begin
  21833. if (Prefix <> '') and not StrMatchLeftU(S, Prefix, AsciiCaseSensitive) then
  21834. S := Prefix + S;
  21835. end;
  21836. procedure StrEnsurePrefix(var S: String; const Prefix: String;
  21837. const AsciiCaseSensitive: Boolean);
  21838. begin
  21839. if (Prefix <> '') and not StrMatchLeft(S, Prefix, AsciiCaseSensitive) then
  21840. S := Prefix + S;
  21841. end;
  21842. {$ENDIF}
  21843. {$IFDEF CLR}
  21844. procedure StrEnsureSuffixA(var S: AnsiString; const Suffix: AnsiString;
  21845. const AsciiCaseSensitive: Boolean);
  21846. begin
  21847. if (Suffix <> '') and not StrMatchRightA(S, Suffix, AsciiCaseSensitive) then
  21848. S := S + Suffix;
  21849. end;
  21850. {$ELSE}
  21851. procedure StrEnsureSuffixA(var S: AnsiString; const Suffix: AnsiString;
  21852. const AsciiCaseSensitive: Boolean);
  21853. var L, M : Integer;
  21854. P : PAnsiChar;
  21855. begin
  21856. if (Suffix <> '') and not StrMatchRightA(S, Suffix, AsciiCaseSensitive) then
  21857. begin
  21858. L := Length(S);
  21859. M := Length(Suffix);
  21860. SetLength(S, L + M);
  21861. P := Pointer(S);
  21862. Inc(P, L);
  21863. MoveMem(Pointer(Suffix)^, P^, M);
  21864. end;
  21865. end;
  21866. procedure StrEnsureSuffixW(var S: WideString; const Suffix: WideString;
  21867. const AsciiCaseSensitive: Boolean);
  21868. begin
  21869. if (Suffix <> '') and not StrMatchRightW(S, Suffix, AsciiCaseSensitive) then
  21870. S := S + Suffix;
  21871. end;
  21872. procedure StrEnsureSuffixU(var S: UnicodeString; const Suffix: UnicodeString;
  21873. const AsciiCaseSensitive: Boolean);
  21874. begin
  21875. if (Suffix <> '') and not StrMatchRightU(S, Suffix, AsciiCaseSensitive) then
  21876. S := S + Suffix;
  21877. end;
  21878. procedure StrEnsureSuffix(var S: String; const Suffix: String;
  21879. const AsciiCaseSensitive: Boolean);
  21880. begin
  21881. if (Suffix <> '') and not StrMatchRight(S, Suffix, AsciiCaseSensitive) then
  21882. S := S + Suffix;
  21883. end;
  21884. {$ENDIF}
  21885. {$IFDEF CLR}
  21886. procedure StrEnsureNoPrefixA(var S: AnsiString; const Prefix: AnsiString;
  21887. const AsciiCaseSensitive: Boolean);
  21888. begin
  21889. if StrMatchLeftA(S, Prefix, AsciiCaseSensitive) then
  21890. Delete(S, 1, Length(Prefix));
  21891. end;
  21892. {$ELSE}
  21893. procedure StrEnsureNoPrefixA(var S: AnsiString; const Prefix: AnsiString;
  21894. const AsciiCaseSensitive: Boolean);
  21895. var L, M : Integer;
  21896. P : PAnsiChar;
  21897. begin
  21898. if StrMatchLeftA(S, Prefix, AsciiCaseSensitive) then
  21899. begin
  21900. L := Length(S);
  21901. M := Length(Prefix);
  21902. P := Pointer(S);
  21903. Inc(P, M);
  21904. MoveMem(P^, Pointer(S)^, L - M);
  21905. SetLength(S, L - M);
  21906. end;
  21907. end;
  21908. procedure StrEnsureNoPrefixW(var S: WideString; const Prefix: WideString;
  21909. const AsciiCaseSensitive: Boolean);
  21910. begin
  21911. if StrMatchLeftW(S, Prefix, AsciiCaseSensitive) then
  21912. Delete(S, 1, Length(Prefix));
  21913. end;
  21914. procedure StrEnsureNoPrefixU(var S: UnicodeString; const Prefix: UnicodeString;
  21915. const AsciiCaseSensitive: Boolean);
  21916. begin
  21917. if StrMatchLeftU(S, Prefix, AsciiCaseSensitive) then
  21918. Delete(S, 1, Length(Prefix));
  21919. end;
  21920. procedure StrEnsureNoPrefix(var S: String; const Prefix: String;
  21921. const AsciiCaseSensitive: Boolean);
  21922. begin
  21923. if StrMatchLeft(S, Prefix, AsciiCaseSensitive) then
  21924. Delete(S, 1, Length(Prefix));
  21925. end;
  21926. {$ENDIF}
  21927. procedure StrEnsureNoSuffixA(var S: AnsiString; const Suffix: AnsiString;
  21928. const AsciiCaseSensitive: Boolean);
  21929. begin
  21930. if StrMatchRightA(S, Suffix, AsciiCaseSensitive) then
  21931. SetLength(S, Length(S) - Length(Suffix));
  21932. end;
  21933. procedure StrEnsureNoSuffixW(var S: WideString; const Suffix: WideString;
  21934. const AsciiCaseSensitive: Boolean);
  21935. begin
  21936. if StrMatchRightW(S, Suffix, AsciiCaseSensitive) then
  21937. SetLength(S, Length(S) - Length(Suffix));
  21938. end;
  21939. procedure StrEnsureNoSuffixU(var S: UnicodeString; const Suffix: UnicodeString;
  21940. const AsciiCaseSensitive: Boolean);
  21941. begin
  21942. if StrMatchRightU(S, Suffix, AsciiCaseSensitive) then
  21943. SetLength(S, Length(S) - Length(Suffix));
  21944. end;
  21945. procedure StrEnsureNoSuffix(var S: String; const Suffix: String;
  21946. const AsciiCaseSensitive: Boolean);
  21947. begin
  21948. if StrMatchRight(S, Suffix, AsciiCaseSensitive) then
  21949. SetLength(S, Length(S) - Length(Suffix));
  21950. end;
  21951. { }
  21952. { Skip }
  21953. { }
  21954. {$IFNDEF ManagedCode}
  21955. function StrZSkipCharA(var P: PAnsiChar; const C: AnsiChar): Boolean;
  21956. var Q : PAnsiChar;
  21957. D : AnsiChar;
  21958. begin
  21959. Q := P;
  21960. if not Assigned(Q) or (C = #0) then
  21961. Result := False
  21962. else
  21963. begin
  21964. D := Q^;
  21965. if D = #0 then
  21966. Result := False else
  21967. if D = C then
  21968. begin
  21969. Inc(P);
  21970. Result := True;
  21971. end
  21972. else
  21973. Result := False;
  21974. end;
  21975. end;
  21976. function StrZSkipCharA(var P: PAnsiChar; const C: CharSet): Boolean;
  21977. var Q : PAnsiChar;
  21978. D : AnsiChar;
  21979. begin
  21980. Q := P;
  21981. if not Assigned(Q) then
  21982. Result := False
  21983. else
  21984. begin
  21985. D := Q^;
  21986. if D = #0 then
  21987. Result := False else
  21988. if D in C then
  21989. begin
  21990. Inc(P);
  21991. Result := True;
  21992. end
  21993. else
  21994. Result := False;
  21995. end;
  21996. end;
  21997. function StrZSkipCharW(var P: PWideChar; const C: WideChar): Boolean;
  21998. var Q : PWideChar;
  21999. D : WideChar;
  22000. begin
  22001. Q := P;
  22002. if not Assigned(Q) or (C = #0) then
  22003. Result := False
  22004. else
  22005. begin
  22006. D := Q^;
  22007. if D = #0 then
  22008. Result := False else
  22009. if D = C then
  22010. begin
  22011. Inc(P);
  22012. Result := True;
  22013. end
  22014. else
  22015. Result := False;
  22016. end;
  22017. end;
  22018. function StrZSkipCharW(var P: PWideChar; const C: CharSet): Boolean;
  22019. var Q : PWideChar;
  22020. D : WideChar;
  22021. begin
  22022. Q := P;
  22023. if not Assigned(Q) then
  22024. Result := False
  22025. else
  22026. begin
  22027. D := Q^;
  22028. if D = #0 then
  22029. Result := False else
  22030. if Ord(D) >= $100 then
  22031. Result := False
  22032. else
  22033. if AnsiChar(Ord(D)) in C then
  22034. begin
  22035. Inc(P);
  22036. Result := True;
  22037. end
  22038. else
  22039. Result := False;
  22040. end;
  22041. end;
  22042. function StrZSkipCharW(var P: PWideChar; const C: TWideCharMatchFunction): Boolean;
  22043. var Q : PWideChar;
  22044. D : WideChar;
  22045. begin
  22046. Q := P;
  22047. if not Assigned(Q) then
  22048. Result := False
  22049. else
  22050. begin
  22051. D := Q^;
  22052. if D = #0 then
  22053. Result := False else
  22054. if C(D) then
  22055. begin
  22056. Inc(P);
  22057. Result := True;
  22058. end
  22059. else
  22060. Result := False;
  22061. end;
  22062. end;
  22063. function StrZSkipChar(var P: PChar; const C: Char): Boolean;
  22064. var Q : PChar;
  22065. D : Char;
  22066. begin
  22067. Q := P;
  22068. if not Assigned(Q) or (C = #0) then
  22069. Result := False
  22070. else
  22071. begin
  22072. D := Q^;
  22073. if D = #0 then
  22074. Result := False else
  22075. if D = C then
  22076. begin
  22077. Inc(P);
  22078. Result := True;
  22079. end
  22080. else
  22081. Result := False;
  22082. end;
  22083. end;
  22084. function StrZSkipChar(var P: PChar; const C: CharSet): Boolean;
  22085. var Q : PChar;
  22086. D : Char;
  22087. begin
  22088. Q := P;
  22089. if not Assigned(Q) then
  22090. Result := False
  22091. else
  22092. begin
  22093. D := Q^;
  22094. if D = #0 then
  22095. Result := False else
  22096. {$IFDEF StringIsUnicode}
  22097. if Ord(D) >= $100 then
  22098. Result := False
  22099. else
  22100. if AnsiChar(Ord(D)) in C then
  22101. begin
  22102. Inc(P);
  22103. Result := True;
  22104. end
  22105. {$ELSE}
  22106. if D in C then
  22107. begin
  22108. Inc(P);
  22109. Result := True;
  22110. end
  22111. {$ENDIF}
  22112. else
  22113. Result := False;
  22114. end;
  22115. end;
  22116. function StrZSkipAllA(var P: PAnsiChar; const C: AnsiChar): Integer;
  22117. var Q : PAnsiChar;
  22118. D : AnsiChar;
  22119. begin
  22120. Result := 0;
  22121. Q := P;
  22122. if not Assigned(Q) or (C = #0) then
  22123. exit;
  22124. repeat
  22125. D := Q^;
  22126. if (D = #0) or (D <> C) then
  22127. break;
  22128. Inc(Q);
  22129. Inc(Result);
  22130. until False;
  22131. P := Q;
  22132. end;
  22133. function StrZSkipAllA(var P: PAnsiChar; const C: CharSet): Integer;
  22134. var Q : PAnsiChar;
  22135. D : AnsiChar;
  22136. begin
  22137. Result := 0;
  22138. Q := P;
  22139. if not Assigned(Q) then
  22140. exit;
  22141. repeat
  22142. D := Q^;
  22143. if (D = #0) or not (D in C) then
  22144. break;
  22145. Inc(Q);
  22146. Inc(Result);
  22147. until False;
  22148. P := Q;
  22149. end;
  22150. function StrZSkipAllW(var P: PWideChar; const C: WideChar): Integer;
  22151. var Q : PWideChar;
  22152. D : WideChar;
  22153. begin
  22154. Result := 0;
  22155. Q := P;
  22156. if not Assigned(Q) or (C = #0) then
  22157. exit;
  22158. repeat
  22159. D := Q^;
  22160. if (D = #0) or (D <> C) then
  22161. break;
  22162. Inc(Q);
  22163. Inc(Result);
  22164. until False;
  22165. P := Q;
  22166. end;
  22167. function StrZSkipAllW(var P: PWideChar; const C: CharSet): Integer;
  22168. var Q : PWideChar;
  22169. D : WideChar;
  22170. begin
  22171. Result := 0;
  22172. Q := P;
  22173. if not Assigned(Q) then
  22174. exit;
  22175. repeat
  22176. D := Q^;
  22177. if (D = #0) or (Ord(D) >= $100) then
  22178. break;
  22179. if not (AnsiChar(Ord(D)) in C) then
  22180. break;
  22181. Inc(Q);
  22182. Inc(Result);
  22183. until False;
  22184. P := Q;
  22185. end;
  22186. function StrZSkipAllW(var P: PWideChar; const C: TWideCharMatchFunction): Integer;
  22187. var Q : PWideChar;
  22188. D : WideChar;
  22189. begin
  22190. Result := 0;
  22191. Q := P;
  22192. if not Assigned(Q) then
  22193. exit;
  22194. repeat
  22195. D := Q^;
  22196. if D = #0 then
  22197. break;
  22198. if not C(D) then
  22199. break;
  22200. Inc(Q);
  22201. Inc(Result);
  22202. until False;
  22203. P := Q;
  22204. end;
  22205. function StrZSkipAll(var P: PChar; const C: Char): Integer;
  22206. var Q : PChar;
  22207. D : Char;
  22208. begin
  22209. Result := 0;
  22210. Q := P;
  22211. if not Assigned(Q) or (C = #0) then
  22212. exit;
  22213. repeat
  22214. D := Q^;
  22215. if (D = #0) or (D <> C) then
  22216. break;
  22217. Inc(Q);
  22218. Inc(Result);
  22219. until False;
  22220. P := Q;
  22221. end;
  22222. function StrZSkipAll(var P: PChar; const C: CharSet): Integer;
  22223. var Q : PChar;
  22224. D : Char;
  22225. begin
  22226. Result := 0;
  22227. Q := P;
  22228. if not Assigned(Q) then
  22229. exit;
  22230. repeat
  22231. D := Q^;
  22232. {$IFDEF StringIsUnicode}
  22233. if (D = #0) or (Ord(D) >= $100) then
  22234. break;
  22235. if not (AnsiChar(Ord(D)) in C) then
  22236. break;
  22237. {$ELSE}
  22238. if (D = #0) or not (D in C) then
  22239. break;
  22240. {$ENDIF}
  22241. Inc(Q);
  22242. Inc(Result);
  22243. until False;
  22244. P := Q;
  22245. end;
  22246. function StrZSkipToCharA(var P: PAnsiChar; const C: AnsiChar): Integer;
  22247. var Q : PAnsiChar;
  22248. D : AnsiChar;
  22249. begin
  22250. Result := 0;
  22251. Q := P;
  22252. if not Assigned(Q) then
  22253. exit;
  22254. repeat
  22255. D := Q^;
  22256. if (D = #0) or (D = C) then
  22257. break;
  22258. Inc(Q);
  22259. Inc(Result);
  22260. until False;
  22261. P := Q;
  22262. end;
  22263. function StrZSkipToCharA(var P: PAnsiChar; const C: CharSet): Integer;
  22264. var Q : PAnsiChar;
  22265. D : AnsiChar;
  22266. begin
  22267. Result := 0;
  22268. Q := P;
  22269. if not Assigned(Q) then
  22270. exit;
  22271. repeat
  22272. D := Q^;
  22273. if (D = #0) or (D in C) then
  22274. break;
  22275. Inc(Q);
  22276. Inc(Result);
  22277. until False;
  22278. P := Q;
  22279. end;
  22280. function StrZSkipToCharW(var P: PWideChar; const C: WideChar): Integer;
  22281. var Q : PWideChar;
  22282. D : WideChar;
  22283. begin
  22284. Result := 0;
  22285. Q := P;
  22286. if not Assigned(Q) then
  22287. exit;
  22288. repeat
  22289. D := Q^;
  22290. if (D = #0) or (D = C) then
  22291. break;
  22292. Inc(Q);
  22293. Inc(Result);
  22294. until False;
  22295. P := Q;
  22296. end;
  22297. function StrZSkipToCharW(var P: PWideChar; const C: CharSet): Integer;
  22298. var Q : PWideChar;
  22299. D : WideChar;
  22300. begin
  22301. Result := 0;
  22302. Q := P;
  22303. if not Assigned(Q) then
  22304. exit;
  22305. repeat
  22306. D := Q^;
  22307. if (D = #0) or (Ord(D) >= $100) then
  22308. break;
  22309. if AnsiChar(Ord(D)) in C then
  22310. break;
  22311. Inc(Q);
  22312. Inc(Result);
  22313. until False;
  22314. P := Q;
  22315. end;
  22316. function StrZSkipToCharW(var P: PWideChar; const C: TWideCharMatchFunction): Integer;
  22317. var Q : PWideChar;
  22318. D : WideChar;
  22319. begin
  22320. Result := 0;
  22321. Q := P;
  22322. if not Assigned(Q) then
  22323. exit;
  22324. repeat
  22325. D := Q^;
  22326. if D = #0 then
  22327. break;
  22328. if C(D) then
  22329. break;
  22330. Inc(Q);
  22331. Inc(Result);
  22332. until False;
  22333. P := Q;
  22334. end;
  22335. function StrZSkipToChar(var P: PChar; const C: CharSet): Integer;
  22336. var Q : PChar;
  22337. D : Char;
  22338. begin
  22339. Result := 0;
  22340. Q := P;
  22341. if not Assigned(Q) then
  22342. exit;
  22343. repeat
  22344. D := Q^;
  22345. if D = #0 then
  22346. break;
  22347. {$IFDEF StringIsUnicode}
  22348. if Ord(D) >= $100 then
  22349. break;
  22350. if AnsiChar(Ord(D)) in C then
  22351. break;
  22352. {$ELSE}
  22353. if D in C then
  22354. break;
  22355. {$ENDIF}
  22356. Inc(Q);
  22357. Inc(Result);
  22358. until False;
  22359. P := Q;
  22360. end;
  22361. function StrZSkipToStrA(var P: PAnsiChar; const S: AnsiString; const AsciiCaseSensitive: Boolean): Integer;
  22362. var Q : PAnsiChar;
  22363. begin
  22364. Result := 0;
  22365. Q := P;
  22366. if not Assigned(Q) then
  22367. exit;
  22368. while (Q^ <> #0) and not StrZMatchStrAsciiA(Q, S, AsciiCaseSensitive) do
  22369. begin
  22370. Inc(Q);
  22371. Inc(Result);
  22372. end;
  22373. P := Q;
  22374. end;
  22375. function StrZSkipToStrW(var P: PWideChar; const S: WideString; const AsciiCaseSensitive: Boolean): Integer;
  22376. var Q : PWideChar;
  22377. begin
  22378. Result := 0;
  22379. Q := P;
  22380. if not Assigned(Q) then
  22381. exit;
  22382. while (Q^ <> #0) and not StrZMatchStrAsciiW(Q, S, AsciiCaseSensitive) do
  22383. begin
  22384. Inc(Q);
  22385. Inc(Result);
  22386. end;
  22387. P := Q;
  22388. end;
  22389. function StrZSkipToStrAW(var P: PWideChar; const S: AnsiString; const AsciiCaseSensitive: Boolean): Integer;
  22390. var Q : PWideChar;
  22391. begin
  22392. Result := 0;
  22393. Q := P;
  22394. if not Assigned(Q) then
  22395. exit;
  22396. while (Q^ <> #0) and not StrZMatchStrAsciiAW(Q, S, AsciiCaseSensitive) do
  22397. begin
  22398. Inc(Q);
  22399. Inc(Result);
  22400. end;
  22401. P := Q;
  22402. end;
  22403. function StrZSkipToStr(var P: PChar; const S: String; const AsciiCaseSensitive: Boolean): Integer;
  22404. var Q : PChar;
  22405. begin
  22406. Result := 0;
  22407. Q := P;
  22408. if not Assigned(Q) then
  22409. exit;
  22410. while (Q^ <> #0) and not StrZMatchStrAscii(Q, S, AsciiCaseSensitive) do
  22411. begin
  22412. Inc(Q);
  22413. Inc(Result);
  22414. end;
  22415. P := Q;
  22416. end;
  22417. function StrZSkip2CharSeq(var P: PAnsiChar; const S1, S2: CharSet): Boolean;
  22418. var Q : PAnsiChar;
  22419. C : AnsiChar;
  22420. begin
  22421. Q := P;
  22422. if not Assigned(Q) then
  22423. begin
  22424. Result := False;
  22425. exit;
  22426. end;
  22427. C := Q^;
  22428. if (C = #0) or not (C in S1) then
  22429. begin
  22430. Result := False;
  22431. exit;
  22432. end;
  22433. Inc(Q);
  22434. C := Q^;
  22435. if (C = #0) or not (C in S2) then
  22436. Result := False
  22437. else
  22438. begin
  22439. Inc(P, 2);
  22440. Result := True;
  22441. end;
  22442. end;
  22443. function StrZSkip3CharSeq(var P: PAnsiChar; const S1, S2, S3: CharSet): Boolean;
  22444. var Q : PAnsiChar;
  22445. C : AnsiChar;
  22446. begin
  22447. Q := P;
  22448. if not Assigned(Q) then
  22449. begin
  22450. Result := False;
  22451. exit;
  22452. end;
  22453. C := Q^;
  22454. if (C = #0) or not (C in S1) then
  22455. begin
  22456. Result := False;
  22457. exit;
  22458. end;
  22459. Inc(Q);
  22460. C := Q^;
  22461. if (C = #0) or not (C in S2) then
  22462. begin
  22463. Result := False;
  22464. exit;
  22465. end;
  22466. Inc(Q);
  22467. C := Q^;
  22468. if (C = #0) or not (C in S3) then
  22469. Result := False
  22470. else
  22471. begin
  22472. Inc(P, 3);
  22473. Result := True;
  22474. end;
  22475. end;
  22476. function StrZSkipStrA(var P: PAnsiChar; const S: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  22477. begin
  22478. Result := StrZMatchStrAsciiA(P, S, AsciiCaseSensitive);
  22479. if Result then
  22480. Inc(P, Length(S));
  22481. end;
  22482. function StrZSkipStrW(var P: PWideChar; const S: WideString; const AsciiCaseSensitive: Boolean): Boolean;
  22483. begin
  22484. Result := StrZMatchStrAsciiW(P, S, AsciiCaseSensitive);
  22485. if Result then
  22486. Inc(P, Length(S));
  22487. end;
  22488. function StrZSkipStrAW(var P: PWideChar; const S: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  22489. begin
  22490. Result := StrZMatchStrAsciiAW(P, S, AsciiCaseSensitive);
  22491. if Result then
  22492. Inc(P, Length(S));
  22493. end;
  22494. function StrZSkipStr(var P: PChar; const S: String; const AsciiCaseSensitive: Boolean): Boolean;
  22495. begin
  22496. Result := StrZMatchStrAscii(P, S, AsciiCaseSensitive);
  22497. if Result then
  22498. Inc(P, Length(S));
  22499. end;
  22500. {$ENDIF}
  22501. { }
  22502. { Extract }
  22503. { }
  22504. {$IFNDEF ManagedCode}
  22505. function StrZExtractAllA(var P: PAnsiChar; const C: AnsiChar): AnsiString;
  22506. var Q : PAnsiChar;
  22507. I : Integer;
  22508. begin
  22509. Q := P;
  22510. I := StrZSkipAllA(P, C);
  22511. Result := StrPToStrA(Q, I);
  22512. end;
  22513. function StrZExtractAllA(var P: PAnsiChar; const C: CharSet): AnsiString;
  22514. var Q : PAnsiChar;
  22515. I : Integer;
  22516. begin
  22517. Q := P;
  22518. I := StrZSkipAllA(P, C);
  22519. Result := StrPToStrA(Q, I);
  22520. end;
  22521. function StrZExtractAllW(var P: PWideChar; const C: WideChar): WideString;
  22522. var Q : PWideChar;
  22523. I : Integer;
  22524. begin
  22525. Q := P;
  22526. I := StrZSkipAllW(P, C);
  22527. Result := StrPToStrW(Q, I);
  22528. end;
  22529. function StrZExtractAllW(var P: PWideChar; const C: CharSet): WideString;
  22530. var Q : PWideChar;
  22531. I : Integer;
  22532. begin
  22533. Q := P;
  22534. I := StrZSkipAllW(P, C);
  22535. Result := StrPToStrW(Q, I);
  22536. end;
  22537. function StrZExtractAllW(var P: PWideChar; const C: TWideCharMatchFunction): WideString;
  22538. var Q : PWideChar;
  22539. I : Integer;
  22540. begin
  22541. Q := P;
  22542. I := StrZSkipAllW(P, C);
  22543. Result := StrPToStrW(Q, I);
  22544. end;
  22545. function StrZExtractAllU(var P: PWideChar; const C: WideChar): UnicodeString;
  22546. var Q : PWideChar;
  22547. I : Integer;
  22548. begin
  22549. Q := P;
  22550. I := StrZSkipAllW(P, C);
  22551. Result := StrPToStrU(Q, I);
  22552. end;
  22553. function StrZExtractAllU(var P: PWideChar; const C: CharSet): UnicodeString;
  22554. var Q : PWideChar;
  22555. I : Integer;
  22556. begin
  22557. Q := P;
  22558. I := StrZSkipAllW(P, C);
  22559. Result := StrPToStrU(Q, I);
  22560. end;
  22561. function StrZExtractAllU(var P: PWideChar; const C: TWideCharMatchFunction): UnicodeString;
  22562. var Q : PWideChar;
  22563. I : Integer;
  22564. begin
  22565. Q := P;
  22566. I := StrZSkipAllW(P, C);
  22567. Result := StrPToStrU(Q, I);
  22568. end;
  22569. function StrZExtractAll(var P: PChar; const C: Char): String;
  22570. var Q : PChar;
  22571. I : Integer;
  22572. begin
  22573. Q := P;
  22574. I := StrZSkipAll(P, C);
  22575. Result := StrPToStr(Q, I);
  22576. end;
  22577. function StrZExtractAll(var P: PChar; const C: CharSet): String;
  22578. var Q : PChar;
  22579. I : Integer;
  22580. begin
  22581. Q := P;
  22582. I := StrZSkipAll(P, C);
  22583. Result := StrPToStr(Q, I);
  22584. end;
  22585. function StrZExtractToA(var P: PAnsiChar; const C: AnsiChar): AnsiString;
  22586. var Q : PAnsiChar;
  22587. L : Integer;
  22588. begin
  22589. Q := P;
  22590. L := StrZSkipToCharA(P, C);
  22591. Result := StrPToStrA(Q, L);
  22592. end;
  22593. function StrZExtractToA(var P: PAnsiChar; const C: CharSet): AnsiString;
  22594. var Q : PAnsiChar;
  22595. L : Integer;
  22596. begin
  22597. Q := P;
  22598. L := StrZSkipToCharA(P, C);
  22599. Result := StrPToStrA(Q, L);
  22600. end;
  22601. function StrZExtractToW(var P: PWideChar; const C: WideChar): WideString;
  22602. var Q : PWideChar;
  22603. L : Integer;
  22604. begin
  22605. Q := P;
  22606. L := StrZSkipToCharW(P, C);
  22607. Result := StrPToStrW(Q, L);
  22608. end;
  22609. function StrZExtractToW(var P: PWideChar; const C: CharSet): WideString;
  22610. var Q : PWideChar;
  22611. L : Integer;
  22612. begin
  22613. Q := P;
  22614. L := StrZSkipToCharW(P, C);
  22615. Result := StrPToStrW(Q, L);
  22616. end;
  22617. function StrZExtractToW(var P: PWideChar; const C: TWideCharMatchFunction): WideString;
  22618. var Q : PWideChar;
  22619. L : Integer;
  22620. begin
  22621. Q := P;
  22622. L := StrZSkipToCharW(P, C);
  22623. Result := StrPToStrW(Q, L);
  22624. end;
  22625. function StrZExtractToU(var P: PWideChar; const C: WideChar): UnicodeString;
  22626. var Q : PWideChar;
  22627. L : Integer;
  22628. begin
  22629. Q := P;
  22630. L := StrZSkipToCharW(P, C);
  22631. Result := StrPToStrU(Q, L);
  22632. end;
  22633. function StrZExtractToU(var P: PWideChar; const C: CharSet): UnicodeString;
  22634. var Q : PWideChar;
  22635. L : Integer;
  22636. begin
  22637. Q := P;
  22638. L := StrZSkipToCharW(P, C);
  22639. Result := StrPToStrU(Q, L);
  22640. end;
  22641. function StrZExtractToU(var P: PWideChar; const C: TWideCharMatchFunction): UnicodeString;
  22642. var Q : PWideChar;
  22643. L : Integer;
  22644. begin
  22645. Q := P;
  22646. L := StrZSkipToCharW(P, C);
  22647. Result := StrPToStrU(Q, L);
  22648. end;
  22649. function StrZExtractTo(var P: PChar; const C: CharSet): String;
  22650. var Q : PChar;
  22651. L : Integer;
  22652. begin
  22653. Q := P;
  22654. L := StrZSkipToChar(P, C);
  22655. Result := StrPToStr(Q, L);
  22656. end;
  22657. function StrZExtractToStrA(var P: PAnsiChar; const S: AnsiString;
  22658. const CaseSensitive: Boolean): AnsiString;
  22659. var Q : PAnsiChar;
  22660. L : Integer;
  22661. begin
  22662. Q := P;
  22663. L := 0;
  22664. while (P^ <> #0) and not StrZMatchStrAsciiA(P, S, CaseSensitive) do
  22665. begin
  22666. Inc(P);
  22667. Inc(L);
  22668. end;
  22669. Result := StrPToStrA(Q, L);
  22670. end;
  22671. function StrZExtractToStrW(var P: PWideChar; const S: WideString;
  22672. const CaseSensitive: Boolean): WideString;
  22673. var Q : PWideChar;
  22674. L : Integer;
  22675. begin
  22676. Q := P;
  22677. L := 0;
  22678. while (P^ <> #0) and not StrZMatchStrAsciiW(P, S, CaseSensitive) do
  22679. begin
  22680. Inc(P);
  22681. Inc(L);
  22682. end;
  22683. Result := StrPToStrW(Q, L);
  22684. end;
  22685. function StrZExtractToStrAW(var P: PWideChar; const S: AnsiString;
  22686. const CaseSensitive: Boolean): WideString;
  22687. var Q : PWideChar;
  22688. L : Integer;
  22689. begin
  22690. Q := P;
  22691. L := 0;
  22692. while (P^ <> #0) and not StrZMatchStrAsciiAW(P, S, CaseSensitive) do
  22693. begin
  22694. Inc(P);
  22695. Inc(L);
  22696. end;
  22697. Result := StrPToStrW(Q, L);
  22698. end;
  22699. function StrZExtractToStrU(var P: PWideChar; const S: UnicodeString;
  22700. const CaseSensitive: Boolean): UnicodeString;
  22701. var Q : PWideChar;
  22702. L : Integer;
  22703. begin
  22704. Q := P;
  22705. L := 0;
  22706. while (P^ <> #0) and not StrZMatchStrAsciiU(P, S, CaseSensitive) do
  22707. begin
  22708. Inc(P);
  22709. Inc(L);
  22710. end;
  22711. Result := StrPToStrU(Q, L);
  22712. end;
  22713. function StrZExtractToStrAU(var P: PWideChar; const S: AnsiString;
  22714. const CaseSensitive: Boolean): UnicodeString;
  22715. var Q : PWideChar;
  22716. L : Integer;
  22717. begin
  22718. Q := P;
  22719. L := 0;
  22720. while (P^ <> #0) and not StrZMatchStrAsciiAW(P, S, CaseSensitive) do
  22721. begin
  22722. Inc(P);
  22723. Inc(L);
  22724. end;
  22725. Result := StrPToStrU(Q, L);
  22726. end;
  22727. function StrZExtractToStr(var P: PChar; const S: String;
  22728. const CaseSensitive: Boolean): String;
  22729. var Q : PChar;
  22730. L : Integer;
  22731. begin
  22732. Q := P;
  22733. L := 0;
  22734. while (P^ <> #0) and not StrZMatchStrAscii(P, S, CaseSensitive) do
  22735. begin
  22736. Inc(P);
  22737. Inc(L);
  22738. end;
  22739. Result := StrPToStr(Q, L);
  22740. end;
  22741. function StrZExtractQuotedA(var P: PAnsiChar; var S: AnsiString; const Quote: CharSet): Boolean;
  22742. var Q : PAnsiChar;
  22743. C, D : AnsiChar;
  22744. L : Integer;
  22745. begin
  22746. C := P^;
  22747. if not (C in Quote) then
  22748. begin
  22749. Result := False;
  22750. exit;
  22751. end;
  22752. Inc(P);
  22753. Q := P;
  22754. L := 0;
  22755. repeat
  22756. D := P^;
  22757. if D = #0 then
  22758. break;
  22759. if D = C then
  22760. begin
  22761. Inc(P);
  22762. break;
  22763. end;
  22764. Inc(P);
  22765. Inc(L);
  22766. until False;
  22767. S := StrPToStrA(Q, L);
  22768. Result := True;
  22769. end;
  22770. function StrZExtractQuotedW(var P: PWideChar; var S: WideString; const Quote: CharSet): Boolean;
  22771. var Q : PWideChar;
  22772. C, D : WideChar;
  22773. L : Integer;
  22774. begin
  22775. C := P^;
  22776. if not WideCharInCharSet(C, Quote) then
  22777. begin
  22778. Result := False;
  22779. exit;
  22780. end;
  22781. Inc(P);
  22782. Q := P;
  22783. L := 0;
  22784. repeat
  22785. D := P^;
  22786. if D = #0 then
  22787. break;
  22788. if D = C then
  22789. begin
  22790. Inc(P);
  22791. break;
  22792. end;
  22793. Inc(P);
  22794. Inc(L);
  22795. until False;
  22796. S := StrPToStrW(Q, L);
  22797. Result := True;
  22798. end;
  22799. function StrZExtractQuotedU(var P: PWideChar; var S: UnicodeString; const Quote: CharSet): Boolean;
  22800. var Q : PWideChar;
  22801. C, D : WideChar;
  22802. L : Integer;
  22803. begin
  22804. C := P^;
  22805. if not WideCharInCharSet(C, Quote) then
  22806. begin
  22807. Result := False;
  22808. exit;
  22809. end;
  22810. Inc(P);
  22811. Q := P;
  22812. L := 0;
  22813. repeat
  22814. D := P^;
  22815. if D = #0 then
  22816. break;
  22817. if D = C then
  22818. begin
  22819. Inc(P);
  22820. break;
  22821. end;
  22822. Inc(P);
  22823. Inc(L);
  22824. until False;
  22825. S := StrPToStrU(Q, L);
  22826. Result := True;
  22827. end;
  22828. function StrZExtractQuoted(var P: PChar; var S: String; const Quote: CharSet): Boolean;
  22829. var Q : PChar;
  22830. C, D : Char;
  22831. L : Integer;
  22832. begin
  22833. C := P^;
  22834. if not CharInCharSet(C, Quote) then
  22835. begin
  22836. Result := False;
  22837. exit;
  22838. end;
  22839. Inc(P);
  22840. Q := P;
  22841. L := 0;
  22842. repeat
  22843. D := P^;
  22844. if D = #0 then
  22845. break;
  22846. if D = C then
  22847. begin
  22848. Inc(P);
  22849. break;
  22850. end;
  22851. Inc(P);
  22852. Inc(L);
  22853. until False;
  22854. S := StrPToStr(Q, L);
  22855. Result := True;
  22856. end;
  22857. {$ENDIF}
  22858. { }
  22859. { Reverse }
  22860. { }
  22861. {$IFDEF CLR}
  22862. function StrReverse(const S: AnsiString): AnsiString;
  22863. var I, L : Integer;
  22864. begin
  22865. L := Length(S);
  22866. if L = 0 then
  22867. begin
  22868. Result := '';
  22869. exit;
  22870. end;
  22871. if L = 1 then
  22872. begin
  22873. Result := S;
  22874. exit;
  22875. end;
  22876. SetLength(Result, L);
  22877. for I := 1 to L do
  22878. Result[I] := S[L - I + 1];
  22879. end;
  22880. {$ELSE}
  22881. function StrReverseA(const S: AnsiString): AnsiString;
  22882. var I, L : Integer;
  22883. P, Q : PAnsiChar;
  22884. begin
  22885. L := Length(S);
  22886. if L = 0 then
  22887. begin
  22888. Result := '';
  22889. exit;
  22890. end;
  22891. if L = 1 then
  22892. begin
  22893. Result := S;
  22894. exit;
  22895. end;
  22896. SetLength(Result, L);
  22897. P := Pointer(S);
  22898. Q := Pointer(Result);
  22899. Inc(Q, L - 1);
  22900. for I := 1 to L do
  22901. begin
  22902. Q^ := P^;
  22903. Dec(Q);
  22904. Inc(P);
  22905. end;
  22906. end;
  22907. function StrReverseW(const S: WideString): WideString;
  22908. var I, L : Integer;
  22909. P, Q : PWideChar;
  22910. begin
  22911. L := Length(S);
  22912. if L = 0 then
  22913. begin
  22914. Result := '';
  22915. exit;
  22916. end;
  22917. if L = 1 then
  22918. begin
  22919. Result := S;
  22920. exit;
  22921. end;
  22922. SetLength(Result, L);
  22923. P := Pointer(S);
  22924. Q := Pointer(Result);
  22925. Inc(Q, L - 1);
  22926. for I := 1 to L do
  22927. begin
  22928. Q^ := P^;
  22929. Dec(Q);
  22930. Inc(P);
  22931. end;
  22932. end;
  22933. function StrReverseU(const S: UnicodeString): UnicodeString;
  22934. var I, L : Integer;
  22935. P, Q : PWideChar;
  22936. begin
  22937. L := Length(S);
  22938. if L = 0 then
  22939. begin
  22940. Result := '';
  22941. exit;
  22942. end;
  22943. if L = 1 then
  22944. begin
  22945. Result := S;
  22946. exit;
  22947. end;
  22948. SetLength(Result, L);
  22949. P := Pointer(S);
  22950. Q := Pointer(Result);
  22951. Inc(Q, L - 1);
  22952. for I := 1 to L do
  22953. begin
  22954. Q^ := P^;
  22955. Dec(Q);
  22956. Inc(P);
  22957. end;
  22958. end;
  22959. function StrReverse(const S: String): String;
  22960. var I, L : Integer;
  22961. P, Q : PChar;
  22962. begin
  22963. L := Length(S);
  22964. if L = 0 then
  22965. begin
  22966. Result := '';
  22967. exit;
  22968. end;
  22969. if L = 1 then
  22970. begin
  22971. Result := S;
  22972. exit;
  22973. end;
  22974. SetLength(Result, L);
  22975. P := Pointer(S);
  22976. Q := Pointer(Result);
  22977. Inc(Q, L - 1);
  22978. for I := 1 to L do
  22979. begin
  22980. Q^ := P^;
  22981. Dec(Q);
  22982. Inc(P);
  22983. end;
  22984. end;
  22985. {$ENDIF}
  22986. { }
  22987. { Base conversion }
  22988. { }
  22989. function BinToLongWord(const S: AnsiString): LongWord;
  22990. var Valid : Boolean;
  22991. begin
  22992. Valid := TryBinToLongWordA(S, Result);
  22993. if not Valid then
  22994. raise EConvertError.Create('Invalid binary string');
  22995. end;
  22996. function OctToLongWord(const S: AnsiString): LongWord;
  22997. var Valid : Boolean;
  22998. begin
  22999. Valid := TryOctToLongWordA(S, Result);
  23000. if not Valid then
  23001. raise EConvertError.Create('Invalid octal string');
  23002. end;
  23003. function StrToLongWord(const S: AnsiString): LongWord;
  23004. var Valid : Boolean;
  23005. begin
  23006. Valid := TryStringToLongWordA(S, Result);
  23007. if not Valid then
  23008. raise EConvertError.Create('Invalid decimal string');
  23009. end;
  23010. function StrToLongWordDef(const S: AnsiString; const Default: LongWord): LongWord;
  23011. var Valid : Boolean;
  23012. begin
  23013. Valid := TryStringToLongWordA(S, Result);
  23014. if not Valid then
  23015. Result := Default;
  23016. end;
  23017. function HexToLongWord(const S: AnsiString): LongWord;
  23018. var Valid : Boolean;
  23019. begin
  23020. Valid := TryHexToLongWordA(S, Result);
  23021. if not Valid then
  23022. raise EConvertError.Create('Invalid hexadecimal string');
  23023. end;
  23024. function HexToLongWordDef(const S: AnsiString; const Default: LongWord): LongWord;
  23025. var Valid : Boolean;
  23026. begin
  23027. Valid := TryHexToLongWordA(S, Result);
  23028. if not Valid then
  23029. Result := Default;
  23030. end;
  23031. { }
  23032. { Type conversion }
  23033. { }
  23034. {$IFDEF DELPHI5}
  23035. function StrToFloatDef(const S: String; const Default: Extended): Extended;
  23036. begin
  23037. try
  23038. Result := StrToFloat(S);
  23039. except
  23040. Result := Default;
  23041. end;
  23042. end;
  23043. {$ELSE}
  23044. function StrToFloatDef(const S: String; const Default: Extended): Extended;
  23045. begin
  23046. if not TryStrToFloat(S, Result) then
  23047. Result := Default;
  23048. end;
  23049. {$ENDIF}
  23050. function BooleanToStrA(const B: Boolean): AnsiString;
  23051. begin
  23052. if B then
  23053. Result := 'True'
  23054. else
  23055. Result := 'False';
  23056. end;
  23057. function BooleanToStrW(const B: Boolean): WideString;
  23058. begin
  23059. if B then
  23060. Result := 'True'
  23061. else
  23062. Result := 'False';
  23063. end;
  23064. function BooleanToStrU(const B: Boolean): UnicodeString;
  23065. begin
  23066. if B then
  23067. Result := 'True'
  23068. else
  23069. Result := 'False';
  23070. end;
  23071. function BooleanToStr(const B: Boolean): String;
  23072. begin
  23073. if B then
  23074. Result := 'True'
  23075. else
  23076. Result := 'False';
  23077. end;
  23078. function StrToBooleanA(const S: AnsiString): Boolean;
  23079. begin
  23080. Result := StrEqualNoAsciiCaseA(S, 'True');
  23081. end;
  23082. function StrToBooleanW(const S: WideString): Boolean;
  23083. begin
  23084. Result := StrEqualNoAsciiCaseW(S, 'True');
  23085. end;
  23086. function StrToBooleanU(const S: UnicodeString): Boolean;
  23087. begin
  23088. Result := StrEqualNoAsciiCaseU(S, 'True');
  23089. end;
  23090. function StrToBoolean(const S: String): Boolean;
  23091. begin
  23092. Result := StrEqualNoAsciiCase(S, 'True');
  23093. end;
  23094. { }
  23095. { Abbreviated regular expression matcher }
  23096. { }
  23097. {$IFNDEF CLR}
  23098. function MatchQuantSeq(var MatchPos: Integer; const MatchSeq: array of CharSet;
  23099. const Quant: array of TMatchQuantifier; const S: AnsiString;
  23100. const MatchOptions: TMatchQuantSeqOptions;
  23101. const StartIndex: Integer; const StopIndex: Integer): Boolean;
  23102. var Stop : Integer;
  23103. Deterministic : Boolean;
  23104. NonGreedy : Boolean;
  23105. function MatchAt(MPos, SPos: Integer; var MatchPos: Integer): Boolean;
  23106. function MatchAndAdvance: Boolean;
  23107. var I : Integer;
  23108. begin
  23109. I := SPos;
  23110. Result := S[I] in MatchSeq[MPos];
  23111. if Result then
  23112. begin
  23113. MatchPos := I;
  23114. Inc(SPos);
  23115. end;
  23116. end;
  23117. function MatchAndSetResult(var Res: Boolean): Boolean;
  23118. begin
  23119. Result := MatchAndAdvance;
  23120. Res := Result;
  23121. if not Result then
  23122. MatchPos := 0;
  23123. end;
  23124. function MatchAny: Boolean;
  23125. var I, L : Integer;
  23126. P : PAnsiChar;
  23127. begin
  23128. L := Stop;
  23129. if Deterministic then
  23130. begin
  23131. while (SPos <= L) and MatchAndAdvance do ;
  23132. Result := False;
  23133. end else
  23134. if NonGreedy then
  23135. repeat
  23136. Result := MatchAt(MPos + 1, SPos, MatchPos);
  23137. if Result or not MatchAndAdvance then
  23138. exit;
  23139. until SPos > L
  23140. else
  23141. begin
  23142. I := SPos;
  23143. P := Pointer(S);
  23144. Inc(P, I - 1);
  23145. while (I <= L) and (P^ in MatchSeq[MPos]) do
  23146. begin
  23147. Inc(I);
  23148. Inc(P);
  23149. end;
  23150. repeat
  23151. MatchPos := I - 1;
  23152. Result := MatchAt(MPos + 1, I, MatchPos);
  23153. if Result then
  23154. exit;
  23155. Dec(I);
  23156. until SPos > I;
  23157. end;
  23158. end;
  23159. var Q : TMatchQuantifier;
  23160. L, M : Integer;
  23161. begin
  23162. L := Length(MatchSeq);
  23163. M := Stop;
  23164. while (MPos < L) and (SPos <= M) do
  23165. begin
  23166. Q := Quant[MPos];
  23167. if Q in [mqOnce, mqLeastOnce] then
  23168. if not MatchAndSetResult(Result) then
  23169. exit;
  23170. if (Q = mqAny) or ((Q = mqLeastOnce) and (SPos <= M)) then
  23171. begin
  23172. Result := MatchAny;
  23173. if Result then
  23174. exit;
  23175. end else
  23176. if Q = mqOptional then
  23177. if Deterministic then
  23178. MatchAndAdvance else
  23179. begin
  23180. if NonGreedy then
  23181. begin
  23182. Result := MatchAt(MPos + 1, SPos, MatchPos);
  23183. if Result or not MatchAndSetResult(Result) then
  23184. exit;
  23185. end else
  23186. begin
  23187. Result := (MatchAndAdvance and MatchAt(MPos + 1, SPos, MatchPos)) or
  23188. MatchAt(MPos + 1, SPos, MatchPos);
  23189. exit;
  23190. end;
  23191. end;
  23192. Inc(MPos);
  23193. end;
  23194. while (MPos < L) and (Quant[MPos] in [mqAny, mqOptional]) do
  23195. Inc(MPos);
  23196. Result := MPos = L;
  23197. if not Result then
  23198. MatchPos := 0;
  23199. end;
  23200. begin
  23201. Assert(Length(MatchSeq) = Length(Quant));
  23202. if StopIndex < 0 then
  23203. Stop := Length(S)
  23204. else
  23205. Stop := MinI(StopIndex, Length(S));
  23206. MatchPos := 0;
  23207. if (Length(MatchSeq) = 0) or (StartIndex > Stop) or (StartIndex <= 0) then
  23208. begin
  23209. Result := False;
  23210. exit;
  23211. end;
  23212. NonGreedy := moNonGreedy in MatchOptions;
  23213. Deterministic := moDeterministic in MatchOptions;
  23214. Result := MatchAt(0, StartIndex, MatchPos);
  23215. end;
  23216. {$ENDIF}
  23217. { }
  23218. { MatchFileMask }
  23219. { }
  23220. function MatchFileMaskA(const Mask, Key: AnsiString; const AsciiCaseSensitive: Boolean): Boolean;
  23221. var ML, KL : Integer;
  23222. function MatchAt(MaskPos, KeyPos: Integer): Boolean;
  23223. begin
  23224. while (MaskPos <= ML) and (KeyPos <= KL) do
  23225. case Mask[MaskPos] of
  23226. '?' :
  23227. begin
  23228. Inc(MaskPos);
  23229. Inc(KeyPos);
  23230. end;
  23231. '*' :
  23232. begin
  23233. while (MaskPos <= ML) and (Mask[MaskPos] = '*') do
  23234. Inc(MaskPos);
  23235. if MaskPos > ML then
  23236. begin
  23237. Result := True;
  23238. exit;
  23239. end;
  23240. repeat
  23241. if MatchAt(MaskPos, KeyPos) then
  23242. begin
  23243. Result := True;
  23244. exit;
  23245. end;
  23246. Inc(KeyPos);
  23247. until KeyPos > KL;
  23248. Result := False;
  23249. exit;
  23250. end;
  23251. else
  23252. if not CharMatchA(Mask[MaskPos], Key[KeyPos], AsciiCaseSensitive) then
  23253. begin
  23254. Result := False;
  23255. exit;
  23256. end else
  23257. begin
  23258. Inc(MaskPos);
  23259. Inc(KeyPos);
  23260. end;
  23261. end;
  23262. while (MaskPos <= ML) and (Mask[MaskPos] in ['?', '*']) do
  23263. Inc(MaskPos);
  23264. if (MaskPos <= ML) or (KeyPos <= KL) then
  23265. begin
  23266. Result := False;
  23267. exit;
  23268. end;
  23269. Result := True;
  23270. end;
  23271. begin
  23272. ML := Length(Mask);
  23273. if ML = 0 then
  23274. begin
  23275. Result := True;
  23276. exit;
  23277. end;
  23278. KL := Length(Key);
  23279. Result := MatchAt(1, 1);
  23280. end;
  23281. { }
  23282. { Character class strings }
  23283. { }
  23284. function CharSetToCharClassStr(const C: CharSet): AnsiString;
  23285. function ChStr(const Ch: AnsiChar): AnsiString;
  23286. begin
  23287. case Ch of
  23288. '\' : Result := '\\';
  23289. ']' : Result := '\]';
  23290. AsciiBEL : Result := '\a';
  23291. AsciiBS : Result := '\b';
  23292. AsciiESC : Result := '\e';
  23293. AsciiFF : Result := '\f';
  23294. AsciiLF : Result := '\n';
  23295. AsciiCR : Result := '\r';
  23296. AsciiHT : Result := '\t';
  23297. AsciiVT : Result := '\v';
  23298. else if (Ch < #32) or (Ch > #127) then // non-printable
  23299. Result := '\x' + LongWordToHexA(Ord(Ch), 1) else
  23300. Result := Ch;
  23301. end;
  23302. end;
  23303. function SeqStr(const SeqStart, SeqEnd: AnsiChar): AnsiString;
  23304. begin
  23305. Result := ChStr(SeqStart);
  23306. if Ord(SeqEnd) = Ord(SeqStart) + 1 then
  23307. Result := Result + ChStr(SeqEnd) else // consequetive chars
  23308. if SeqEnd > SeqStart then // range
  23309. Result := Result + '-' + ChStr(SeqEnd);
  23310. end;
  23311. var CS : CharSet;
  23312. F : AnsiChar;
  23313. SeqStart : AnsiChar;
  23314. Seq : Boolean;
  23315. begin
  23316. if IsComplete(C) then
  23317. Result := '.' else
  23318. if IsEmpty(C) then
  23319. Result := '[]' else
  23320. begin
  23321. Result := '[';
  23322. CS := C;
  23323. if (AnsiChar(#0) in C) and (AnsiChar(#255) in C) then
  23324. begin
  23325. ComplementCharSet(CS);
  23326. Result := Result + '^';
  23327. end;
  23328. Seq := False;
  23329. SeqStart := #0;
  23330. for F := #0 to #255 do
  23331. if F in CS then
  23332. begin
  23333. if not Seq then
  23334. begin
  23335. SeqStart := F;
  23336. Seq := True;
  23337. end;
  23338. end else
  23339. if Seq then
  23340. begin
  23341. Result := Result + SeqStr(SeqStart, AnsiChar(Ord(F) - 1));
  23342. Seq := False;
  23343. end;
  23344. if Seq then
  23345. Result := Result + SeqStr(SeqStart, #255);
  23346. Result := Result + ']';
  23347. end;
  23348. end;
  23349. {$IFNDEF CLR}
  23350. function CharClassStrToCharSet(const S: AnsiString): CharSet;
  23351. var I, L : Integer;
  23352. function DecodeChar: AnsiChar;
  23353. var J : Integer;
  23354. begin
  23355. if S[I] = '\' then
  23356. if I + 1 = L then
  23357. begin
  23358. Inc(I);
  23359. Result := '\';
  23360. end else
  23361. if not MatchQuantSeq(J, [['x'], csHexDigit, csHexDigit],
  23362. [mqOnce, mqOnce, mqOptional], S, [moDeterministic], I + 1) then
  23363. begin
  23364. case S[I + 1] of
  23365. '0' : Result := AsciiNULL;
  23366. 'a' : Result := AsciiBEL;
  23367. 'b' : Result := AsciiBS;
  23368. 'e' : Result := AsciiESC;
  23369. 'f' : Result := AsciiFF;
  23370. 'n' : Result := AsciiLF;
  23371. 'r' : Result := AsciiCR;
  23372. 't' : Result := AsciiHT;
  23373. 'v' : Result := AsciiVT;
  23374. else Result := S[I + 1];
  23375. end;
  23376. Inc(I, 2);
  23377. end else
  23378. begin
  23379. if J = I + 2 then
  23380. Result := AnsiChar(HexAnsiCharToInt(S[J])) else
  23381. Result := AnsiChar(HexAnsiCharToInt(S[J - 1]) * 16 + HexAnsiCharToInt(S[J]));
  23382. I := J + 1;
  23383. end
  23384. else
  23385. begin
  23386. Result := S[I];
  23387. Inc(I);
  23388. end;
  23389. end;
  23390. var Neg : Boolean;
  23391. A, B : AnsiChar;
  23392. begin
  23393. L := Length(S);
  23394. if (L = 0) or (S = '[]') then
  23395. Result := [] else
  23396. if L = 1 then
  23397. if S[1] in ['.', '*', '?'] then
  23398. Result := CompleteCharSet else
  23399. Result := [S[1]] else
  23400. if (S[1] <> '[') or (S[L] <> ']') then
  23401. raise EConvertError.Create('Invalid character class string')
  23402. else
  23403. begin
  23404. Neg := S[2] = '^';
  23405. I := iif(Neg, 3, 2);
  23406. Result := [];
  23407. while I < L do
  23408. begin
  23409. A := DecodeChar;
  23410. if (I + 1 < L) and (S[I] = '-') then
  23411. begin
  23412. Inc(I);
  23413. B := DecodeChar;
  23414. Result := Result + [A..B];
  23415. end else
  23416. Include(Result, A);
  23417. end;
  23418. if Neg then
  23419. ComplementCharSet(Result);
  23420. end;
  23421. end;
  23422. {$ENDIF}
  23423. { }
  23424. { Dynamic array functions }
  23425. { }
  23426. function StringsTotalLengthA(const S: array of AnsiString): Integer;
  23427. var I : Integer;
  23428. begin
  23429. Result := 0;
  23430. for I := 0 to Length(S) - 1 do
  23431. Inc(Result, Length(S[I]));
  23432. end;
  23433. function StringsTotalLengthW(const S: array of WideString): Integer;
  23434. var I : Integer;
  23435. begin
  23436. Result := 0;
  23437. for I := 0 to Length(S) - 1 do
  23438. Inc(Result, Length(S[I]));
  23439. end;
  23440. function StringsTotalLengthU(const S: array of UnicodeString): Integer;
  23441. var I : Integer;
  23442. begin
  23443. Result := 0;
  23444. for I := 0 to Length(S) - 1 do
  23445. Inc(Result, Length(S[I]));
  23446. end;
  23447. function StringsTotalLength(const S: array of String): Integer;
  23448. var I : Integer;
  23449. begin
  23450. Result := 0;
  23451. for I := 0 to Length(S) - 1 do
  23452. Inc(Result, Length(S[I]));
  23453. end;
  23454. function PosNextNoCase(const Find: AnsiString; const V: array of AnsiString;
  23455. const PrevPos: Integer; const IsSortedAscending: Boolean): Integer;
  23456. var I, L, H : Integer;
  23457. begin
  23458. if IsSortedAscending then // binary search
  23459. begin
  23460. if MaxI(PrevPos + 1, 0) = 0 then // find first
  23461. begin
  23462. L := 0;
  23463. H := Length(V) - 1;
  23464. repeat
  23465. I := (L + H) div 2;
  23466. if StrEqualNoAsciiCaseA(V[I], Find) then
  23467. begin
  23468. while (I > 0) and StrEqualNoAsciiCaseA(V[I - 1], Find) do
  23469. Dec(I);
  23470. Result := I;
  23471. exit;
  23472. end else
  23473. if StrCompareNoAsciiCaseA(V[I], Find) = 1 then
  23474. H := I - 1 else
  23475. L := I + 1;
  23476. until L > H;
  23477. Result := -1;
  23478. end else // find next
  23479. if PrevPos >= Length(V) - 1 then
  23480. Result := -1 else
  23481. if StrEqualNoAsciiCaseA(V[PrevPos + 1], Find) then
  23482. Result := PrevPos + 1 else
  23483. Result := -1;
  23484. end else
  23485. begin // linear search
  23486. for I := MaxI(PrevPos + 1, 0) to Length(V) - 1 do
  23487. if StrEqualNoAsciiCaseA(V[I], Find) then
  23488. begin
  23489. Result := I;
  23490. exit;
  23491. end;
  23492. Result := -1;
  23493. end;
  23494. end;
  23495. { }
  23496. { Natural language }
  23497. { }
  23498. function StorageSize(const Bytes: Int64; const ShortFormat: Boolean): String;
  23499. var Size, Suffix : String;
  23500. Fmt : String;
  23501. Len : Integer;
  23502. begin
  23503. Fmt := iif(ShortFormat, '%1.0f', '%0.1f');
  23504. if Bytes < 1024 then
  23505. begin
  23506. Size := IntToStr(Bytes);
  23507. Suffix := iif(ShortFormat, 'B', 'bytes');
  23508. end else
  23509. if Bytes < 1024 * 1024 then
  23510. begin
  23511. Size := Format(Fmt, [Bytes / 1024.0]);
  23512. Suffix := iif(ShortFormat, 'K', 'KB');
  23513. end else
  23514. if Bytes < 1024 * 1024 * 1024 then
  23515. begin
  23516. Size := Format(Fmt, [Bytes / (1024.0 * 1024.0)]);
  23517. Suffix := iif(ShortFormat, 'M', 'MB');
  23518. end else
  23519. if Bytes < Int64(1024) * 1024 * 1024 * 1024 then
  23520. begin
  23521. Size := Format(Fmt, [Bytes / (1024.0 * 1024.0 * 1024.0)]);
  23522. Suffix := iif(ShortFormat, 'G', 'GB');
  23523. end else
  23524. if Bytes < Int64(1024) * 1024 * 1024 * 1024 * 1024 then
  23525. begin
  23526. Size := Format(Fmt, [Bytes / (1024.0 * 1024.0 * 1024.0 * 1024.0)]);
  23527. Suffix := iif(ShortFormat, 'T', 'TB');
  23528. end
  23529. else
  23530. begin
  23531. Size := Format(Fmt, [Bytes / (1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)]);
  23532. Suffix := iif(ShortFormat, 'P', 'PB');
  23533. end;
  23534. Len := Length(Size);
  23535. if Copy(Size, Len - 1, 2) = '.0' then
  23536. SetLength(Size, Len - 2);
  23537. Result := Size + ' ' + Suffix;
  23538. end;
  23539. function TransferRate(const Bytes, MillisecondsElapsed: Int64;
  23540. const ShortFormat: Boolean): String;
  23541. begin
  23542. if MillisecondsElapsed <= 0 then
  23543. Result := ''
  23544. else
  23545. Result := StorageSize(Trunc(Bytes / (MillisecondsElapsed / 1000.0)), ShortFormat) + '/s';
  23546. end;
  23547. {$IFNDEF ManagedCode}
  23548. { }
  23549. { String Builder }
  23550. { }
  23551. function StringBuilderNewCapacity(const L, N: Integer): Integer; {$IFDEF UseInline}inline;{$ENDIF}
  23552. begin
  23553. // memory allocation strategy
  23554. if N = 0 then // first allocation is exactly as requested
  23555. Result := L else
  23556. if L < 16 then // if grow to < 16 then allocate 16
  23557. Result := 16
  23558. else // if grow to >= 16 then pre-allocate 1/4
  23559. Result := L + (L shr 2);
  23560. end;
  23561. { }
  23562. { TAnsiStringBuilder }
  23563. { }
  23564. constructor TAnsiStringBuilder.Create(const S: AnsiString);
  23565. begin
  23566. inherited Create;
  23567. SetAsAnsiString(S);
  23568. end;
  23569. constructor TAnsiStringBuilder.Create(const Capacity: Integer);
  23570. begin
  23571. inherited Create;
  23572. EnsureCapacity(Capacity);
  23573. end;
  23574. procedure TAnsiStringBuilder.EnsureCapacity(const L: Integer);
  23575. var N : Integer;
  23576. begin
  23577. N := System.Length(FString);
  23578. if L > N then
  23579. begin
  23580. N := StringBuilderNewCapacity(L, N);
  23581. SetLength(FString, N);
  23582. end;
  23583. end;
  23584. function TAnsiStringBuilder.GetAsAnsiString: AnsiString;
  23585. begin
  23586. if FLength = System.Length(FString) then
  23587. Result := FString // return reference instead of copy
  23588. else
  23589. Result := Copy(FString, 1, FLength);
  23590. end;
  23591. procedure TAnsiStringBuilder.SetAsAnsiString(const S: AnsiString);
  23592. begin
  23593. FString := S;
  23594. FLength := System.Length(S);
  23595. end;
  23596. function TAnsiStringBuilder.GetAsString: String;
  23597. begin
  23598. {$IFDEF StringIsUnicode}
  23599. Result := String(GetAsAnsiString);
  23600. {$ELSE}
  23601. Result := GetAsAnsiString;
  23602. {$ENDIF}
  23603. end;
  23604. procedure TAnsiStringBuilder.Clear;
  23605. begin
  23606. FString := '';
  23607. FLength := 0;
  23608. end;
  23609. procedure TAnsiStringBuilder.Assign(const S: TAnsiStringBuilder);
  23610. var L : Integer;
  23611. begin
  23612. L := S.FLength;
  23613. FString := Copy(S.FString, 1, L);
  23614. FLength := L;
  23615. end;
  23616. procedure TAnsiStringBuilder.Append(const S: AnsiString);
  23617. var M, L, N : Integer;
  23618. P : PAnsiChar;
  23619. begin
  23620. M := System.Length(S);
  23621. if M = 0 then
  23622. exit;
  23623. N := FLength;
  23624. L := N + M;
  23625. if L > System.Length(FString) then
  23626. EnsureCapacity(L);
  23627. P := Pointer(FString);
  23628. Inc(P, N);
  23629. MoveMem(Pointer(S)^, P^, M);
  23630. FLength := L;
  23631. end;
  23632. procedure TAnsiStringBuilder.AppendCRLF;
  23633. begin
  23634. Append(AsciiCRLF);
  23635. end;
  23636. procedure TAnsiStringBuilder.AppendLn(const S: AnsiString);
  23637. begin
  23638. Append(S);
  23639. AppendCRLF;
  23640. end;
  23641. procedure TAnsiStringBuilder.Append(const S: AnsiString; const Count: Integer);
  23642. var M, L, N, I : Integer;
  23643. P : PAnsiChar;
  23644. begin
  23645. if Count <= 0 then
  23646. exit;
  23647. M := System.Length(S);
  23648. if M = 0 then
  23649. exit;
  23650. N := FLength;
  23651. L := N + (M * Count);
  23652. if L > System.Length(FString) then
  23653. EnsureCapacity(L);
  23654. P := Pointer(FString);
  23655. Inc(P, N);
  23656. for I := 1 to Count do
  23657. begin
  23658. MoveMem(Pointer(S)^, P^, M);
  23659. Inc(P, M);
  23660. end;
  23661. FLength := L;
  23662. end;
  23663. procedure TAnsiStringBuilder.AppendCh(const C: AnsiChar);
  23664. var L, N : Integer;
  23665. P : PAnsiChar;
  23666. begin
  23667. N := FLength;
  23668. L := N + 1;
  23669. if L > System.Length(FString) then
  23670. EnsureCapacity(L);
  23671. P := Pointer(FString);
  23672. Inc(P, N);
  23673. P^ := C;
  23674. FLength := L;
  23675. end;
  23676. procedure TAnsiStringBuilder.AppendCh(const C: AnsiChar; const Count: Integer);
  23677. var L, N : Integer;
  23678. P : PAnsiChar;
  23679. begin
  23680. if Count <= 0 then
  23681. exit;
  23682. N := FLength;
  23683. L := N + Count;
  23684. if L > System.Length(FString) then
  23685. EnsureCapacity(L);
  23686. P := Pointer(FString);
  23687. Inc(P, N);
  23688. FillMem(P^, Count, Ord(C));
  23689. FLength := L;
  23690. end;
  23691. procedure TAnsiStringBuilder.Append(const BufPtr: Pointer; const Size: Integer);
  23692. var L, N : Integer;
  23693. P : PAnsiChar;
  23694. begin
  23695. if Size <= 0 then
  23696. exit;
  23697. N := FLength;
  23698. L := N + Size;
  23699. if L > System.Length(FString) then
  23700. EnsureCapacity(L);
  23701. P := Pointer(FString);
  23702. Inc(P, N);
  23703. MoveMem(BufPtr^, P^, Size);
  23704. FLength := L;
  23705. end;
  23706. procedure TAnsiStringBuilder.Append(const S: TAnsiStringBuilder);
  23707. var M, L, N : Integer;
  23708. P : PAnsiChar;
  23709. begin
  23710. M := S.FLength;
  23711. if M = 0 then
  23712. exit;
  23713. N := FLength;
  23714. L := N + M;
  23715. if L > System.Length(FString) then
  23716. EnsureCapacity(L);
  23717. P := Pointer(FString);
  23718. Inc(P, N);
  23719. MoveMem(Pointer(S.FString)^, P^, M);
  23720. FLength := L;
  23721. end;
  23722. procedure TAnsiStringBuilder.Pack;
  23723. var L : Integer;
  23724. begin
  23725. L := FLength;
  23726. if L = System.Length(FString) then
  23727. exit;
  23728. SetLength(FString, L);
  23729. end;
  23730. { }
  23731. { TWideStringBuilder }
  23732. { }
  23733. constructor TWideStringBuilder.Create(const S: WideString);
  23734. begin
  23735. inherited Create;
  23736. SetAsWideString(S);
  23737. end;
  23738. constructor TWideStringBuilder.Create(const Capacity: Integer);
  23739. begin
  23740. inherited Create;
  23741. EnsureCapacity(Capacity);
  23742. end;
  23743. procedure TWideStringBuilder.EnsureCapacity(const L: Integer);
  23744. var N : Integer;
  23745. begin
  23746. N := System.Length(FString);
  23747. if L > N then
  23748. begin
  23749. N := StringBuilderNewCapacity(L, N);
  23750. SetLength(FString, N);
  23751. end;
  23752. end;
  23753. function TWideStringBuilder.GetAsWideString: WideString;
  23754. begin
  23755. if FLength = System.Length(FString) then
  23756. Result := FString
  23757. else
  23758. Result := Copy(FString, 1, FLength);
  23759. end;
  23760. procedure TWideStringBuilder.SetAsWideString(const S: WideString);
  23761. begin
  23762. FString := S;
  23763. FLength := System.Length(S);
  23764. end;
  23765. procedure TWideStringBuilder.Clear;
  23766. begin
  23767. FString := '';
  23768. FLength := 0;
  23769. end;
  23770. procedure TWideStringBuilder.Assign(const S: TWideStringBuilder);
  23771. var L : Integer;
  23772. begin
  23773. L := S.FLength;
  23774. FString := Copy(S.FString, 1, L);
  23775. FLength := L;
  23776. end;
  23777. procedure TWideStringBuilder.Append(const S: WideString);
  23778. var M, L, N : Integer;
  23779. P : PWideChar;
  23780. begin
  23781. M := System.Length(S);
  23782. if M = 0 then
  23783. exit;
  23784. N := FLength;
  23785. L := N + M;
  23786. if L > System.Length(FString) then
  23787. EnsureCapacity(L);
  23788. P := Pointer(FString);
  23789. Inc(P, N);
  23790. MoveMem(Pointer(S)^, P^, M * 2);
  23791. FLength := L;
  23792. end;
  23793. procedure TWideStringBuilder.AppendLn(const S: WideString);
  23794. begin
  23795. Append(S);
  23796. Append(WideCRLF);
  23797. end;
  23798. procedure TWideStringBuilder.Append(const S: WideString; const Count: Integer);
  23799. var M, L, N, I : Integer;
  23800. P : PWideChar;
  23801. begin
  23802. if Count <= 0 then
  23803. exit;
  23804. M := System.Length(S);
  23805. if M = 0 then
  23806. exit;
  23807. N := FLength;
  23808. L := N + (M * Count);
  23809. if L > System.Length(FString) then
  23810. EnsureCapacity(L);
  23811. P := Pointer(FString);
  23812. Inc(P, N);
  23813. for I := 1 to Count do
  23814. begin
  23815. MoveMem(Pointer(S)^, P^, M * 2);
  23816. Inc(P, M);
  23817. end;
  23818. FLength := L;
  23819. end;
  23820. procedure TWideStringBuilder.AppendCh(const C: WideChar);
  23821. var L, N : Integer;
  23822. P : PWideChar;
  23823. begin
  23824. N := FLength;
  23825. L := N + 1;
  23826. if L > System.Length(FString) then
  23827. EnsureCapacity(L);
  23828. P := Pointer(FString);
  23829. Inc(P, N);
  23830. P^ := C;
  23831. FLength := L;
  23832. end;
  23833. procedure TWideStringBuilder.AppendCh(const C: WideChar; const Count: Integer);
  23834. var L, N, I : Integer;
  23835. P : PWideChar;
  23836. begin
  23837. if Count <= 0 then
  23838. exit;
  23839. N := FLength;
  23840. L := N + Count;
  23841. if L > System.Length(FString) then
  23842. EnsureCapacity(L);
  23843. P := Pointer(FString);
  23844. Inc(P, N);
  23845. for I := 0 to Count - 1 do
  23846. begin
  23847. P^ := C;
  23848. Inc(P);
  23849. end;
  23850. FLength := L;
  23851. end;
  23852. procedure TWideStringBuilder.Append(const S: TWideStringBuilder);
  23853. var M, L, N : Integer;
  23854. P : PWideChar;
  23855. begin
  23856. M := S.FLength;
  23857. if M = 0 then
  23858. exit;
  23859. N := FLength;
  23860. L := N + M;
  23861. if L > System.Length(FString) then
  23862. EnsureCapacity(L);
  23863. P := Pointer(FString);
  23864. Inc(P, N);
  23865. MoveMem(Pointer(S.FString)^, P^, M * 2);
  23866. FLength := L;
  23867. end;
  23868. procedure TWideStringBuilder.Pack;
  23869. var L : Integer;
  23870. begin
  23871. L := FLength;
  23872. if L = System.Length(FString) then
  23873. exit;
  23874. SetLength(FString, L);
  23875. end;
  23876. { }
  23877. { TUnicodeStringBuilder }
  23878. { }
  23879. constructor TUnicodeStringBuilder.Create(const S: UnicodeString);
  23880. begin
  23881. inherited Create;
  23882. SetAsUnicodeString(S);
  23883. end;
  23884. constructor TUnicodeStringBuilder.Create(const Capacity: Integer);
  23885. begin
  23886. inherited Create;
  23887. EnsureCapacity(Capacity);
  23888. end;
  23889. procedure TUnicodeStringBuilder.EnsureCapacity(const L: Integer);
  23890. var N : Integer;
  23891. begin
  23892. N := System.Length(FString);
  23893. if L > N then
  23894. begin
  23895. N := StringBuilderNewCapacity(L, N);
  23896. SetLength(FString, N);
  23897. end;
  23898. end;
  23899. function TUnicodeStringBuilder.GetAsUnicodeString: UnicodeString;
  23900. begin
  23901. if FLength = System.Length(FString) then
  23902. Result := FString
  23903. else
  23904. Result := Copy(FString, 1, FLength);
  23905. end;
  23906. procedure TUnicodeStringBuilder.SetAsUnicodeString(const S: UnicodeString);
  23907. begin
  23908. FString := S;
  23909. FLength := System.Length(S);
  23910. end;
  23911. procedure TUnicodeStringBuilder.Clear;
  23912. begin
  23913. FString := '';
  23914. FLength := 0;
  23915. end;
  23916. procedure TUnicodeStringBuilder.Assign(const S: TUnicodeStringBuilder);
  23917. var L : Integer;
  23918. begin
  23919. L := S.FLength;
  23920. FString := Copy(S.FString, 1, L);
  23921. FLength := L;
  23922. end;
  23923. procedure TUnicodeStringBuilder.Append(const S: UnicodeString);
  23924. var M, L, N : Integer;
  23925. P : PWideChar;
  23926. begin
  23927. M := System.Length(S);
  23928. if M = 0 then
  23929. exit;
  23930. N := FLength;
  23931. L := N + M;
  23932. if L > System.Length(FString) then
  23933. EnsureCapacity(L);
  23934. P := Pointer(FString);
  23935. Inc(P, N);
  23936. MoveMem(Pointer(S)^, P^, M * 2);
  23937. FLength := L;
  23938. end;
  23939. procedure TUnicodeStringBuilder.AppendLn(const S: UnicodeString);
  23940. begin
  23941. Append(S);
  23942. Append(WideCRLF);
  23943. end;
  23944. procedure TUnicodeStringBuilder.Append(const S: UnicodeString; const Count: Integer);
  23945. var M, L, N, I : Integer;
  23946. P : PWideChar;
  23947. begin
  23948. if Count <= 0 then
  23949. exit;
  23950. M := System.Length(S);
  23951. if M = 0 then
  23952. exit;
  23953. N := FLength;
  23954. L := N + (M * Count);
  23955. if L > System.Length(FString) then
  23956. EnsureCapacity(L);
  23957. P := Pointer(FString);
  23958. Inc(P, N);
  23959. for I := 1 to Count do
  23960. begin
  23961. MoveMem(Pointer(S)^, P^, M * 2);
  23962. Inc(P, M);
  23963. end;
  23964. FLength := L;
  23965. end;
  23966. procedure TUnicodeStringBuilder.AppendCh(const C: WideChar);
  23967. var L, N : Integer;
  23968. P : PWideChar;
  23969. begin
  23970. N := FLength;
  23971. L := N + 1;
  23972. if L > System.Length(FString) then
  23973. EnsureCapacity(L);
  23974. P := Pointer(FString);
  23975. Inc(P, N);
  23976. P^ := C;
  23977. FLength := L;
  23978. end;
  23979. procedure TUnicodeStringBuilder.AppendCh(const C: WideChar; const Count: Integer);
  23980. var L, N, I : Integer;
  23981. P : PWideChar;
  23982. begin
  23983. if Count <= 0 then
  23984. exit;
  23985. N := FLength;
  23986. L := N + Count;
  23987. if L > System.Length(FString) then
  23988. EnsureCapacity(L);
  23989. P := Pointer(FString);
  23990. Inc(P, N);
  23991. for I := 0 to Count - 1 do
  23992. begin
  23993. P^ := C;
  23994. Inc(P);
  23995. end;
  23996. FLength := L;
  23997. end;
  23998. procedure TUnicodeStringBuilder.Append(const S: TUnicodeStringBuilder);
  23999. var M, L, N : Integer;
  24000. P : PWideChar;
  24001. begin
  24002. M := S.FLength;
  24003. if M = 0 then
  24004. exit;
  24005. N := FLength;
  24006. L := N + M;
  24007. if L > System.Length(FString) then
  24008. EnsureCapacity(L);
  24009. P := Pointer(FString);
  24010. Inc(P, N);
  24011. MoveMem(Pointer(S.FString)^, P^, M * 2);
  24012. FLength := L;
  24013. end;
  24014. procedure TUnicodeStringBuilder.Pack;
  24015. var L : Integer;
  24016. begin
  24017. L := FLength;
  24018. if L = System.Length(FString) then
  24019. exit;
  24020. SetLength(FString, L);
  24021. end;
  24022. { }
  24023. { TStringBuilder }
  24024. { }
  24025. constructor TStringBuilder.Create(const S: String);
  24026. begin
  24027. inherited Create;
  24028. SetAsString(S);
  24029. end;
  24030. constructor TStringBuilder.Create(const Capacity: Integer);
  24031. begin
  24032. inherited Create;
  24033. EnsureCapacity(Capacity);
  24034. end;
  24035. procedure TStringBuilder.EnsureCapacity(const L: Integer);
  24036. var N : Integer;
  24037. begin
  24038. N := System.Length(FString);
  24039. if L > N then
  24040. begin
  24041. N := StringBuilderNewCapacity(L, N);
  24042. SetLength(FString, N);
  24043. end;
  24044. end;
  24045. function TStringBuilder.GetAsString: String;
  24046. begin
  24047. if FLength = System.Length(FString) then
  24048. Result := FString // return reference instead of copy
  24049. else
  24050. Result := Copy(FString, 1, FLength);
  24051. end;
  24052. procedure TStringBuilder.SetAsString(const S: String);
  24053. begin
  24054. FString := S;
  24055. FLength := System.Length(S);
  24056. end;
  24057. procedure TStringBuilder.Clear;
  24058. begin
  24059. FString := '';
  24060. FLength := 0;
  24061. end;
  24062. procedure TStringBuilder.Assign(const S: TStringBuilder);
  24063. var L : Integer;
  24064. begin
  24065. L := S.FLength;
  24066. FString := Copy(S.FString, 1, L);
  24067. FLength := L;
  24068. end;
  24069. procedure TStringBuilder.Append(const S: String);
  24070. var M, L, N : Integer;
  24071. P : PChar;
  24072. begin
  24073. M := System.Length(S);
  24074. if M = 0 then
  24075. exit;
  24076. N := FLength;
  24077. L := N + M;
  24078. if L > System.Length(FString) then
  24079. EnsureCapacity(L);
  24080. P := Pointer(FString);
  24081. Inc(P, N);
  24082. MoveMem(Pointer(S)^, P^, M);
  24083. FLength := L;
  24084. end;
  24085. procedure TStringBuilder.AppendLn(const S: String);
  24086. begin
  24087. Append(S);
  24088. Append(CRLF);
  24089. end;
  24090. procedure TStringBuilder.Append(const S: String; const Count: Integer);
  24091. var M, L, N, I : Integer;
  24092. P : PChar;
  24093. begin
  24094. if Count <= 0 then
  24095. exit;
  24096. M := System.Length(S);
  24097. if M = 0 then
  24098. exit;
  24099. N := FLength;
  24100. L := N + (M * Count);
  24101. if L > System.Length(FString) then
  24102. EnsureCapacity(L);
  24103. P := Pointer(FString);
  24104. Inc(P, N);
  24105. for I := 1 to Count do
  24106. begin
  24107. MoveMem(Pointer(S)^, P^, M);
  24108. Inc(P, M);
  24109. end;
  24110. FLength := L;
  24111. end;
  24112. procedure TStringBuilder.AppendCh(const C: Char);
  24113. var L, N : Integer;
  24114. P : PChar;
  24115. begin
  24116. N := FLength;
  24117. L := N + 1;
  24118. if L > System.Length(FString) then
  24119. EnsureCapacity(L);
  24120. P := Pointer(FString);
  24121. Inc(P, N);
  24122. P^ := C;
  24123. FLength := L;
  24124. end;
  24125. procedure TStringBuilder.AppendCh(const C: Char; const Count: Integer);
  24126. var L, N : Integer;
  24127. P : PChar;
  24128. begin
  24129. if Count <= 0 then
  24130. exit;
  24131. N := FLength;
  24132. L := N + Count;
  24133. if L > System.Length(FString) then
  24134. EnsureCapacity(L);
  24135. P := Pointer(FString);
  24136. Inc(P, N);
  24137. FillMem(P^, Count, Ord(C));
  24138. FLength := L;
  24139. end;
  24140. procedure TStringBuilder.Append(const S: TStringBuilder);
  24141. var M, L, N : Integer;
  24142. P : PChar;
  24143. begin
  24144. M := S.FLength;
  24145. if M = 0 then
  24146. exit;
  24147. N := FLength;
  24148. L := N + M;
  24149. if L > System.Length(FString) then
  24150. EnsureCapacity(L);
  24151. P := Pointer(FString);
  24152. Inc(P, N);
  24153. MoveMem(Pointer(S.FString)^, P^, M);
  24154. FLength := L;
  24155. end;
  24156. procedure TStringBuilder.Pack;
  24157. var L : Integer;
  24158. begin
  24159. L := FLength;
  24160. if L = System.Length(FString) then
  24161. exit;
  24162. SetLength(FString, L);
  24163. end;
  24164. {$ENDIF}
  24165. { }
  24166. { Test cases }
  24167. { }
  24168. {$IFDEF STRINGS_SELFTEST}
  24169. {$ASSERTIONS ON}
  24170. procedure SelfTest;
  24171. var C : AnsiChar;
  24172. D : WideChar;
  24173. E : Char;
  24174. S, T : AnsiString;
  24175. W, X : WideString;
  24176. Y, Z : String;
  24177. L : AnsiStringArray;
  24178. I : Integer;
  24179. begin
  24180. { Unicode character functions }
  24181. Assert(UnicodeIsAsciiChar('A'), 'IsASCIIChar');
  24182. Assert(not UnicodeIsAsciiChar(#$1234), 'IsASCIIChar');
  24183. Assert(UnicodeIsWhiteSpace(' '), 'IsWhiteSpace');
  24184. Assert(UnicodeIsPunctuation('.'), 'IsPunctuation');
  24185. Assert(not UnicodeIsPunctuation('A'), 'IsPunctuation');
  24186. Assert(UnicodeIsDecimalDigit(WideChar('0')), 'IsDecimalDigit');
  24187. Assert(UnicodeDecimalDigitValue(WideChar('5')) = 5, 'DecimalDigitValue');
  24188. Assert(UnicodeIsUpperCase('A'), 'IsUpperCase');
  24189. Assert(not UnicodeIsUpperCase('a'), 'IsUpperCase');
  24190. Assert(UnicodeIsLetter('A'), 'IsLetter');
  24191. Assert(not UnicodeIsLetter('1'), 'IsLetter');
  24192. Assert(UnicodeUpCase('a') = 'A', 'UnicodeUpCase');
  24193. Assert(UnicodeUpCase('A') = 'A', 'UnicodeUpCase');
  24194. Assert(UnicodeLowCase('a') = 'a', 'UnicodeUpCase');
  24195. Assert(UnicodeLowCase('A') = 'a', 'UnicodeUpCase');
  24196. { IsAsciiChar }
  24197. Assert(IsAsciiCharA(#32));
  24198. Assert(IsAsciiCharW(#32));
  24199. Assert(IsAsciiChar(#32));
  24200. Assert(not IsAsciiCharA(#128));
  24201. Assert(not IsAsciiCharW(#128));
  24202. Assert(not IsAsciiChar(#128));
  24203. { CharMatch }
  24204. Assert(CharMatchA(AnsiChar('A'), AnsiChar('a'), False));
  24205. Assert(CharMatchA(AnsiChar('a'), AnsiChar('A'), False));
  24206. Assert(CharMatchA(AnsiChar('A'), AnsiChar('A'), False));
  24207. { CharMatchNoAsciiCase }
  24208. Assert(CharMatchNoAsciiCaseAW('A', 'a'), 'CharMatchNoAsciiCase');
  24209. Assert(CharMatchNoAsciiCaseAW('z', 'Z'), 'CharMatchNoAsciiCase');
  24210. Assert(CharMatchNoAsciiCaseAW('1', '1'), 'CharMatchNoAsciiCase');
  24211. Assert(not CharMatchNoAsciiCaseAW('A', 'B'), 'CharMatchNoAsciiCase');
  24212. Assert(not CharMatchNoAsciiCaseAW('0', 'A'), 'CharMatchNoAsciiCase');
  24213. { CharSetMatchChar }
  24214. Assert(CharSetMatchCharA(['a'..'z'], AnsiChar('a'), False));
  24215. Assert(CharSetMatchCharA(['a'..'z'], AnsiChar('A'), False));
  24216. Assert(not CharSetMatchCharA(['a'..'z'], AnsiChar('-'), False));
  24217. Assert(not CharSetMatchCharA(['a'..'z'], AnsiChar('A'), True));
  24218. Assert(not CharSetMatchCharA([], AnsiChar('A')));
  24219. { Type matching }
  24220. Assert(StrIsNumericA('1234567890'), 'StrIsNumeric');
  24221. Assert(not StrIsNumericA('1234567890X'), 'StrIsNumeric');
  24222. Assert(not StrIsNumericA(''), 'StrIsNumeric');
  24223. Assert(StrIsIntegerA('-1234567890'), 'StrIsInteger');
  24224. Assert(StrIsIntegerA('0'), 'StrIsInteger');
  24225. Assert(not StrIsIntegerA('-1234567890X'), 'StrIsInteger');
  24226. Assert(not StrIsIntegerA('-'), 'StrIsInteger');
  24227. Assert(StrIsNumericW('1234567890'), 'StrIsNumeric');
  24228. Assert(not StrIsNumericW('1234567890X'), 'StrIsNumeric');
  24229. Assert(not StrIsNumericW(''), 'StrIsNumeric');
  24230. Assert(StrIsIntegerW('-1234567890'), 'StrIsInteger');
  24231. Assert(StrIsIntegerW('0'), 'StrIsInteger');
  24232. Assert(not StrIsIntegerW('-1234567890X'), 'StrIsInteger');
  24233. Assert(not StrIsIntegerW('-'), 'StrIsInteger');
  24234. Assert(StrIsNumeric('1234567890'), 'StrIsNumeric');
  24235. Assert(not StrIsNumeric('1234567890X'), 'StrIsNumeric');
  24236. Assert(not StrIsNumeric(''), 'StrIsNumeric');
  24237. Assert(StrIsInteger('-1234567890'), 'StrIsInteger');
  24238. Assert(StrIsInteger('0'), 'StrIsInteger');
  24239. Assert(not StrIsInteger('-1234567890X'), 'StrIsInteger');
  24240. Assert(not StrIsInteger('-'), 'StrIsInteger');
  24241. { CopyRange }
  24242. Assert(CopyRangeA('', 1, 2) = '', 'CopyRange');
  24243. Assert(CopyRangeA('', -1, -2) = '', 'CopyRange');
  24244. Assert(CopyRangeA('1234567890', 5, 7) = '567', 'CopyRange');
  24245. Assert(CopyRangeA('1234567890', 1, 1) = '1', 'CopyRange');
  24246. Assert(CopyRangeA('1234567890', 0, 11) = '1234567890', 'CopyRange');
  24247. Assert(CopyRangeA('1234567890', 7, 4) = '', 'CopyRange');
  24248. Assert(CopyRangeA('1234567890', 1, 0) = '', 'CopyRange');
  24249. Assert(CopyRangeA('1234567890', -2, 3) = '123', 'CopyRange');
  24250. Assert(CopyRangeA('1234567890', 2, -1) = '', 'CopyRange');
  24251. Assert(CopyRangeA('1234567890', -4, -2) = '', 'CopyRange');
  24252. Assert(CopyRangeW('', 1, 2) = '', 'CopyRange');
  24253. Assert(CopyRangeW('', -1, -2) = '', 'CopyRange');
  24254. Assert(CopyRangeW('1234567890', 5, 7) = '567', 'CopyRange');
  24255. Assert(CopyRangeW('1234567890', 1, 1) = '1', 'CopyRange');
  24256. Assert(CopyRangeW('1234567890', 0, 11) = '1234567890', 'CopyRange');
  24257. Assert(CopyRangeW('1234567890', 7, 4) = '', 'CopyRange');
  24258. Assert(CopyRangeW('1234567890', 1, 0) = '', 'CopyRange');
  24259. Assert(CopyRangeW('1234567890', -2, 3) = '123', 'CopyRange');
  24260. Assert(CopyRangeW('1234567890', 2, -1) = '', 'CopyRange');
  24261. Assert(CopyRangeW('1234567890', -4, -2) = '', 'CopyRange');
  24262. Assert(CopyRangeU('', 1, 2) = '', 'CopyRange');
  24263. Assert(CopyRangeU('', -1, -2) = '', 'CopyRange');
  24264. Assert(CopyRangeU('1234567890', 5, 7) = '567', 'CopyRange');
  24265. Assert(CopyRangeU('1234567890', 1, 1) = '1', 'CopyRange');
  24266. Assert(CopyRangeU('1234567890', 0, 11) = '1234567890', 'CopyRange');
  24267. Assert(CopyRangeU('1234567890', 7, 4) = '', 'CopyRange');
  24268. Assert(CopyRangeU('1234567890', 1, 0) = '', 'CopyRange');
  24269. Assert(CopyRangeU('1234567890', -2, 3) = '123', 'CopyRange');
  24270. Assert(CopyRangeU('1234567890', 2, -1) = '', 'CopyRange');
  24271. Assert(CopyRangeU('1234567890', -4, -2) = '', 'CopyRange');
  24272. Assert(CopyRange('', 1, 2) = '', 'CopyRange');
  24273. Assert(CopyRange('', -1, -2) = '', 'CopyRange');
  24274. Assert(CopyRange('1234567890', 5, 7) = '567', 'CopyRange');
  24275. Assert(CopyRange('1234567890', 1, 1) = '1', 'CopyRange');
  24276. Assert(CopyRange('1234567890', 0, 11) = '1234567890', 'CopyRange');
  24277. Assert(CopyRange('1234567890', 7, 4) = '', 'CopyRange');
  24278. Assert(CopyRange('1234567890', 1, 0) = '', 'CopyRange');
  24279. Assert(CopyRange('1234567890', -2, 3) = '123', 'CopyRange');
  24280. Assert(CopyRange('1234567890', 2, -1) = '', 'CopyRange');
  24281. Assert(CopyRange('1234567890', -4, -2) = '', 'CopyRange');
  24282. { CopyFrom }
  24283. Assert(CopyFromA('a', 0) = 'a', 'CopyFrom');
  24284. Assert(CopyFromA('a', -1) = 'a', 'CopyFrom');
  24285. Assert(CopyFromA('', 1) = '', 'CopyFrom');
  24286. Assert(CopyFromA('', -2) = '', 'CopyFrom');
  24287. Assert(CopyFromA('1234567890', 8) = '890', 'CopyFrom');
  24288. Assert(CopyFromA('1234567890', 11) = '', 'CopyFrom');
  24289. Assert(CopyFromA('1234567890', 0) = '1234567890', 'CopyFrom');
  24290. Assert(CopyFromA('1234567890', -2) = '1234567890', 'CopyFrom');
  24291. Assert(CopyFromW('a', 0) = 'a', 'CopyFrom');
  24292. Assert(CopyFromW('a', -1) = 'a', 'CopyFrom');
  24293. Assert(CopyFromW('', 1) = '', 'CopyFrom');
  24294. Assert(CopyFromW('', -2) = '', 'CopyFrom');
  24295. Assert(CopyFromW('1234567890', 8) = '890', 'CopyFrom');
  24296. Assert(CopyFromW('1234567890', 11) = '', 'CopyFrom');
  24297. Assert(CopyFromW('1234567890', 0) = '1234567890', 'CopyFrom');
  24298. Assert(CopyFromW('1234567890', -2) = '1234567890', 'CopyFrom');
  24299. Assert(CopyFrom('a', 0) = 'a', 'CopyFrom');
  24300. Assert(CopyFrom('a', -1) = 'a', 'CopyFrom');
  24301. Assert(CopyFrom('', 1) = '', 'CopyFrom');
  24302. Assert(CopyFrom('', -2) = '', 'CopyFrom');
  24303. Assert(CopyFrom('1234567890', 8) = '890', 'CopyFrom');
  24304. Assert(CopyFrom('1234567890', 11) = '', 'CopyFrom');
  24305. Assert(CopyFrom('1234567890', 0) = '1234567890', 'CopyFrom');
  24306. Assert(CopyFrom('1234567890', -2) = '1234567890', 'CopyFrom');
  24307. { CopyLeft }
  24308. Assert(CopyLeftA('a', 0) = '', 'CopyLeft');
  24309. Assert(CopyLeftA('a', -1) = '', 'CopyLeft');
  24310. Assert(CopyLeftA('', 1) = '', 'CopyLeft');
  24311. Assert(CopyLeftA('b', 1) = 'b', 'CopyLeft');
  24312. Assert(CopyLeftA('', -1) = '', 'CopyLeft');
  24313. Assert(CopyLeftA('1234567890', 3) = '123', 'CopyLeft');
  24314. Assert(CopyLeftA('1234567890', 11) = '1234567890', 'CopyLeft');
  24315. Assert(CopyLeftA('1234567890', 0) = '', 'CopyLeft');
  24316. Assert(CopyLeftA('1234567890', -2) = '', 'CopyLeft');
  24317. Assert(CopyLeftW('a', 0) = '', 'CopyLeft');
  24318. Assert(CopyLeftW('a', -1) = '', 'CopyLeft');
  24319. Assert(CopyLeftW('', 1) = '', 'CopyLeft');
  24320. Assert(CopyLeftW('b', 1) = 'b', 'CopyLeft');
  24321. Assert(CopyLeftW('', -1) = '', 'CopyLeft');
  24322. Assert(CopyLeftW('1234567890', 3) = '123', 'CopyLeft');
  24323. Assert(CopyLeftW('1234567890', 11) = '1234567890', 'CopyLeft');
  24324. Assert(CopyLeftW('1234567890', 0) = '', 'CopyLeft');
  24325. Assert(CopyLeftW('1234567890', -2) = '', 'CopyLeft');
  24326. Assert(CopyLeftU('a', 0) = '', 'CopyLeft');
  24327. Assert(CopyLeftU('a', -1) = '', 'CopyLeft');
  24328. Assert(CopyLeftU('', 1) = '', 'CopyLeft');
  24329. Assert(CopyLeftU('b', 1) = 'b', 'CopyLeft');
  24330. Assert(CopyLeftU('', -1) = '', 'CopyLeft');
  24331. Assert(CopyLeftU('1234567890', 3) = '123', 'CopyLeft');
  24332. Assert(CopyLeftU('1234567890', 11) = '1234567890', 'CopyLeft');
  24333. Assert(CopyLeftU('1234567890', 0) = '', 'CopyLeft');
  24334. Assert(CopyLeftU('1234567890', -2) = '', 'CopyLeft');
  24335. Assert(CopyLeft('a', 0) = '', 'CopyLeft');
  24336. Assert(CopyLeft('a', -1) = '', 'CopyLeft');
  24337. Assert(CopyLeft('', 1) = '', 'CopyLeft');
  24338. Assert(CopyLeft('b', 1) = 'b', 'CopyLeft');
  24339. Assert(CopyLeft('', -1) = '', 'CopyLeft');
  24340. Assert(CopyLeft('1234567890', 3) = '123', 'CopyLeft');
  24341. Assert(CopyLeft('1234567890', 11) = '1234567890', 'CopyLeft');
  24342. Assert(CopyLeft('1234567890', 0) = '', 'CopyLeft');
  24343. Assert(CopyLeft('1234567890', -2) = '', 'CopyLeft');
  24344. { CopyRight }
  24345. Assert(CopyRightA('a', 0) = '', 'CopyRight');
  24346. Assert(CopyRightA('a', -1) = '', 'CopyRight');
  24347. Assert(CopyRightA('', 1) = '', 'CopyRight');
  24348. Assert(CopyRightA('', -2) = '', 'CopyRight');
  24349. Assert(CopyRightA('1234567890', 3) = '890', 'CopyRight');
  24350. Assert(CopyRightA('1234567890', 11) = '1234567890', 'CopyRight');
  24351. Assert(CopyRightA('1234567890', 0) = '', 'CopyRight');
  24352. Assert(CopyRightA('1234567890', -2) = '', 'CopyRight');
  24353. Assert(CopyRightW('a', 0) = '', 'CopyRight');
  24354. Assert(CopyRightW('a', -1) = '', 'CopyRight');
  24355. Assert(CopyRightW('', 1) = '', 'CopyRight');
  24356. Assert(CopyRightW('', -2) = '', 'CopyRight');
  24357. Assert(CopyRightW('1234567890', 3) = '890', 'CopyRight');
  24358. Assert(CopyRightW('1234567890', 11) = '1234567890', 'CopyRight');
  24359. Assert(CopyRightW('1234567890', 0) = '', 'CopyRight');
  24360. Assert(CopyRightW('1234567890', -2) = '', 'CopyRight');
  24361. Assert(CopyRight('a', 0) = '', 'CopyRight');
  24362. Assert(CopyRight('a', -1) = '', 'CopyRight');
  24363. Assert(CopyRight('', 1) = '', 'CopyRight');
  24364. Assert(CopyRight('', -2) = '', 'CopyRight');
  24365. Assert(CopyRight('1234567890', 3) = '890', 'CopyRight');
  24366. Assert(CopyRight('1234567890', 11) = '1234567890', 'CopyRight');
  24367. Assert(CopyRight('1234567890', 0) = '', 'CopyRight');
  24368. Assert(CopyRight('1234567890', -2) = '', 'CopyRight');
  24369. { CopyEx }
  24370. Assert(CopyExA('', 1, 1) = '');
  24371. Assert(CopyExA('', -2, -1) = '');
  24372. Assert(CopyExA('12345', -2, 2) = '45');
  24373. Assert(CopyExA('12345', -1, 2) = '5');
  24374. Assert(CopyExA('12345', -7, 2) = '12');
  24375. Assert(CopyExA('12345', -5, 2) = '12');
  24376. Assert(CopyExA('12345', 2, -2) = '');
  24377. Assert(CopyExA('12345', -4, 0) = '');
  24378. Assert(CopyExA('12345', -4, 7) = '2345');
  24379. Assert(CopyExA('12345', 2, 2) = '23');
  24380. Assert(CopyExA('12345', -7, -6) = '');
  24381. Assert(CopyExA('12345', 0, 2) = '12');
  24382. Assert(CopyExA('12345', 0, 7) = '12345');
  24383. Assert(CopyExW('', 1, 1) = '');
  24384. Assert(CopyExW('', -2, -1) = '');
  24385. Assert(CopyExW('12345', -2, 2) = '45');
  24386. Assert(CopyExW('12345', -1, 2) = '5');
  24387. Assert(CopyExW('12345', -7, 2) = '12');
  24388. Assert(CopyExW('12345', -5, 2) = '12');
  24389. Assert(CopyExW('12345', 2, -2) = '');
  24390. Assert(CopyExW('12345', -4, 0) = '');
  24391. Assert(CopyExW('12345', -4, 7) = '2345');
  24392. Assert(CopyExW('12345', 2, 2) = '23');
  24393. Assert(CopyExW('12345', -7, -6) = '');
  24394. Assert(CopyExW('12345', 0, 2) = '12');
  24395. Assert(CopyExW('12345', 0, 7) = '12345');
  24396. Assert(CopyEx('', 1, 1) = '');
  24397. Assert(CopyEx('', -2, -1) = '');
  24398. Assert(CopyEx('12345', -2, 2) = '45');
  24399. Assert(CopyEx('12345', -1, 2) = '5');
  24400. Assert(CopyEx('12345', -7, 2) = '12');
  24401. Assert(CopyEx('12345', -5, 2) = '12');
  24402. Assert(CopyEx('12345', 2, -2) = '');
  24403. Assert(CopyEx('12345', -4, 0) = '');
  24404. Assert(CopyEx('12345', -4, 7) = '2345');
  24405. Assert(CopyEx('12345', 2, 2) = '23');
  24406. Assert(CopyEx('12345', -7, -6) = '');
  24407. Assert(CopyEx('12345', 0, 2) = '12');
  24408. Assert(CopyEx('12345', 0, 7) = '12345');
  24409. { CopyRangeEx }
  24410. Assert(CopyRangeEx('', -2, -1) = '');
  24411. Assert(CopyRangeEx('', 0, 0) = '');
  24412. Assert(CopyRangeEx('12345', -2, -1) = '45');
  24413. Assert(CopyRangeEx('12345', -2, -1) = '45');
  24414. Assert(CopyRangeEx('12345', -2, 5) = '45');
  24415. Assert(CopyRangeEx('12345', 2, -2) = '234');
  24416. Assert(CopyRangeEx('12345', 0, -2) = '1234');
  24417. Assert(CopyRangeEx('12345', 1, -7) = '');
  24418. Assert(CopyRangeEx('12345', 7, -1) = '');
  24419. Assert(CopyRangeEx('12345', -10, 2) = '12');
  24420. Assert(CopyRangeEx('12345', -10, -7) = '');
  24421. Assert(CopyRangeEx('12345', 2, -6) = '');
  24422. Assert(CopyRangeEx('12345', 0, -2) = '1234');
  24423. Assert(CopyRangeEx('12345', 2, 0) = '');
  24424. Assert(CopyRangeEx('', -1, 2) = '');
  24425. { CopyFromEx }
  24426. Assert(CopyFromEx('', 0) = '');
  24427. Assert(CopyFromEx('', -1) = '');
  24428. Assert(CopyFromEx('12345', 0) = '12345');
  24429. Assert(CopyFromEx('12345', 1) = '12345');
  24430. Assert(CopyFromEx('12345', -5) = '12345');
  24431. Assert(CopyFromEx('12345', -6) = '12345');
  24432. Assert(CopyFromEx('12345', 2) = '2345');
  24433. Assert(CopyFromEx('12345', -4) = '2345');
  24434. Assert(CopyFromEx('12345', 6) = '');
  24435. { Case functions }
  24436. Assert(AsciiLowCaseA('A') = 'a');
  24437. Assert(AsciiLowCaseW('A') = 'a');
  24438. Assert(AsciiLowCase('A') = 'a');
  24439. Assert(AsciiLowCaseA('a') = 'a');
  24440. Assert(AsciiLowCaseW('a') = 'a');
  24441. Assert(AsciiLowCase('a') = 'a');
  24442. Assert(AsciiUpCaseA('A') = 'A');
  24443. Assert(AsciiUpCaseW('A') = 'A');
  24444. Assert(AsciiUpCase('A') = 'A');
  24445. Assert(AsciiUpCaseA('a') = 'A');
  24446. Assert(AsciiUpCaseW('a') = 'A');
  24447. Assert(AsciiUpCase('a') = 'A');
  24448. S := '012AbcdEF';
  24449. AsciiConvertUpperA(S);
  24450. Assert(S = '012ABCDEF');
  24451. W := '012AbcdEF';
  24452. AsciiConvertUpperW(W);
  24453. Assert(W = '012ABCDEF');
  24454. Y := '012AbcdEF';
  24455. AsciiConvertUpper(Y);
  24456. Assert(Y = '012ABCDEF');
  24457. S := '012AbcdEF';
  24458. AsciiConvertLowerA(S);
  24459. Assert(S = '012abcdef');
  24460. W := '012AbcdEF';
  24461. AsciiConvertLowerW(W);
  24462. Assert(W = '012abcdef');
  24463. Y := '012AbcdEF';
  24464. AsciiConvertLower(Y);
  24465. Assert(Y = '012abcdef');
  24466. Assert(AsciiLowCaseA('A') = 'a', 'LowCase');
  24467. Assert(UpCase('a') = 'A', 'UpCase');
  24468. Assert(AsciiLowCaseA('-') = '-', 'LowCase');
  24469. Assert(UpCase('}') = '}', 'UpCase');
  24470. Assert(AsciiFirstUpA('abra') = 'Abra', 'FirstUp');
  24471. Assert(AsciiFirstUpA('') = '', 'FirstUp');
  24472. {$IFDEF DELPHI2007_DOWN}{$IFNDEF CLR}
  24473. for C := #0 to #255 do
  24474. Assert(AsciiLowCase(C) = LowerCase(C), 'LowCase = LowerCase');
  24475. {$ENDIF}{$ENDIF}
  24476. for C := 'A' to 'Z' do
  24477. Assert(AsciiLowCaseA(C) <> C, 'LowCase');
  24478. for C := 'a' to 'z' do
  24479. Assert(AsciiLowCaseA(C) = C, 'LowCase');
  24480. Assert(CharEqualNoAsciiCaseA('a', 'a'));
  24481. Assert(CharEqualNoAsciiCaseA('B', 'b'));
  24482. Assert(not CharEqualNoAsciiCaseA('C', 'D'));
  24483. S := 'aBcDEfg-123';
  24484. AsciiConvertUpperA(S);
  24485. Assert(S = 'ABCDEFG-123', 'ConvertUpper');
  24486. S := 'aBcDEfg-123';
  24487. AsciiConvertLowerA(S);
  24488. Assert(S = 'abcdefg-123', 'ConvertLower');
  24489. S := '';
  24490. AsciiConvertLowerA(S);
  24491. Assert(S = '', 'ConvertLower');
  24492. S := 'abc';
  24493. AsciiConvertLowerA(S);
  24494. Assert(S = 'abc', 'ConvertLower');
  24495. { StrEqualNoCase }
  24496. Assert(StrEqualNoAsciiCaseA('A', 'a'), 'StrEqualNoCase');
  24497. Assert(not StrEqualNoAsciiCaseA('A', 'B'), 'StrEqualNoCase');
  24498. Assert(StrEqualNoAsciiCaseA('@ABCDEFGHIJKLMNOPQRSTUVWXYZ` ', '@abcdefghijklmnopqrstuvwxyz` '), 'StrEqualNoCase');
  24499. Assert(not StrEqualNoAsciiCaseA('@ABCDEFGHIJKLMNOPQRSTUVWXY-` ', '@abcdefghijklmnopqrstuvwxyz` '), 'StrEqualNoCase');
  24500. Assert(StrEqualNoAsciiCaseW('A', 'a'), 'StrEqualNoCase');
  24501. Assert(not StrEqualNoAsciiCaseW('A', 'B'), 'StrEqualNoCase');
  24502. Assert(StrEqualNoAsciiCaseW('@ABCDEFGHIJKLMNOPQRSTUVWXYZ` ', '@abcdefghijklmnopqrstuvwxyz` '), 'StrEqualNoCase');
  24503. Assert(not StrEqualNoAsciiCaseW('@ABCDEFGHIJKLMNOPQRSTUVWXY-` ', '@abcdefghijklmnopqrstuvwxyz` '), 'StrEqualNoCase');
  24504. Assert(StrEqualNoAsciiCaseU('A', 'a'), 'StrEqualNoCase');
  24505. Assert(not StrEqualNoAsciiCaseU('A', 'B'), 'StrEqualNoCase');
  24506. Assert(StrEqualNoAsciiCaseU('@ABCDEFGHIJKLMNOPQRSTUVWXYZ` ', '@abcdefghijklmnopqrstuvwxyz` '), 'StrEqualNoCase');
  24507. Assert(not StrEqualNoAsciiCaseU('@ABCDEFGHIJKLMNOPQRSTUVWXY-` ', '@abcdefghijklmnopqrstuvwxyz` '), 'StrEqualNoCase');
  24508. Assert(StrEqualNoAsciiCase('A', 'a'), 'StrEqualNoCase');
  24509. Assert(not StrEqualNoAsciiCase('A', 'B'), 'StrEqualNoCase');
  24510. Assert(StrEqualNoAsciiCase('@ABCDEFGHIJKLMNOPQRSTUVWXYZ` ', '@abcdefghijklmnopqrstuvwxyz` '), 'StrEqualNoCase');
  24511. Assert(not StrEqualNoAsciiCase('@ABCDEFGHIJKLMNOPQRSTUVWXY-` ', '@abcdefghijklmnopqrstuvwxyz` '), 'StrEqualNoCase');
  24512. { StrReverse }
  24513. Assert(StrReverseA('12345') = '54321', 'StrReverse');
  24514. Assert(StrReverseA('1234') = '4321', 'StrReverse');
  24515. Assert(StrReverseW('12345') = '54321', 'StrReverse');
  24516. Assert(StrReverseW('1234') = '4321', 'StrReverse');
  24517. Assert(StrReverseU('12345') = '54321', 'StrReverse');
  24518. Assert(StrReverseU('1234') = '4321', 'StrReverse');
  24519. Assert(StrReverse('12345') = '54321', 'StrReverse');
  24520. Assert(StrReverse('1234') = '4321', 'StrReverse');
  24521. { Compare }
  24522. Assert(StrCompareNoAsciiCaseA('a', 'a') = 0, 'StrCompareNoCase');
  24523. Assert(StrCompareNoAsciiCaseA('a', 'b') = -1, 'StrCompareNoCase');
  24524. Assert(StrCompareNoAsciiCaseA('b', 'a') = 1, 'StrCompareNoCase');
  24525. Assert(StrCompareNoAsciiCaseA('A', 'a') = 0, 'StrCompareNoCase');
  24526. Assert(StrCompareNoAsciiCaseA('A', 'b') = -1, 'StrCompareNoCase');
  24527. Assert(StrCompareNoAsciiCaseA('b', 'A') = 1, 'StrCompareNoCase');
  24528. Assert(StrCompareNoAsciiCaseA('aa', 'a') = 1, 'StrCompareNoCase');
  24529. Assert(StrCompareNoAsciiCaseA('a', 'aa') = -1, 'StrCompareNoCase');
  24530. Assert(StrCompareNoAsciiCaseA('AA', 'b') = -1, 'StrCompareNoCase');
  24531. Assert(StrCompareNoAsciiCaseA('B', 'aa') = 1, 'StrCompareNoCase');
  24532. Assert(StrCompareNoAsciiCaseA('aa', 'Aa') = 0, 'StrCompareNoCase');
  24533. Assert(StrCompareA('A', 'a') = -1, 'StrCompareNoCase');
  24534. Assert(StrCompareA('a', 'A') = 1, 'StrCompareNoCase');
  24535. Assert(StrCompareA('a', 'aa') = -1, 'StrCompareNoCase');
  24536. Assert(StrCompareA('', '') = 0, 'StrCompareNoCase');
  24537. Assert(StrCompareA('', 'a') = -1, 'StrCompareNoCase');
  24538. Assert(StrCompareA('a', '') = 1, 'StrCompareNoCase');
  24539. Assert(StrCompareNoAsciiCaseW('a', 'a') = 0, 'StrCompareNoCase');
  24540. Assert(StrCompareNoAsciiCaseW('a', 'b') = -1, 'StrCompareNoCase');
  24541. Assert(StrCompareNoAsciiCaseW('b', 'a') = 1, 'StrCompareNoCase');
  24542. Assert(StrCompareNoAsciiCaseW('A', 'a') = 0, 'StrCompareNoCase');
  24543. Assert(StrCompareNoAsciiCaseW('A', 'b') = -1, 'StrCompareNoCase');
  24544. Assert(StrCompareNoAsciiCaseW('b', 'A') = 1, 'StrCompareNoCase');
  24545. Assert(StrCompareNoAsciiCaseW('aa', 'a') = 1, 'StrCompareNoCase');
  24546. Assert(StrCompareNoAsciiCaseW('a', 'aa') = -1, 'StrCompareNoCase');
  24547. Assert(StrCompareNoAsciiCaseW('AA', 'b') = -1, 'StrCompareNoCase');
  24548. Assert(StrCompareNoAsciiCaseW('B', 'aa') = 1, 'StrCompareNoCase');
  24549. Assert(StrCompareNoAsciiCaseW('aa', 'Aa') = 0, 'StrCompareNoCase');
  24550. Assert(StrCompareW('A', 'a') = -1, 'StrCompareNoCase');
  24551. Assert(StrCompareW('a', 'A') = 1, 'StrCompareNoCase');
  24552. Assert(StrCompareW('a', 'aa') = -1, 'StrCompareNoCase');
  24553. Assert(StrCompareW('', '') = 0, 'StrCompareNoCase');
  24554. Assert(StrCompareW('', 'a') = -1, 'StrCompareNoCase');
  24555. Assert(StrCompareW('a', '') = 1, 'StrCompareNoCase');
  24556. Assert(StrCompareNoAsciiCaseU('a', 'a') = 0, 'StrCompareNoCase');
  24557. Assert(StrCompareNoAsciiCaseU('a', 'b') = -1, 'StrCompareNoCase');
  24558. Assert(StrCompareNoAsciiCaseU('b', 'a') = 1, 'StrCompareNoCase');
  24559. Assert(StrCompareNoAsciiCaseU('A', 'a') = 0, 'StrCompareNoCase');
  24560. Assert(StrCompareNoAsciiCaseU('A', 'b') = -1, 'StrCompareNoCase');
  24561. Assert(StrCompareNoAsciiCaseU('b', 'A') = 1, 'StrCompareNoCase');
  24562. Assert(StrCompareNoAsciiCaseU('aa', 'a') = 1, 'StrCompareNoCase');
  24563. Assert(StrCompareNoAsciiCaseU('a', 'aa') = -1, 'StrCompareNoCase');
  24564. Assert(StrCompareNoAsciiCaseU('AA', 'b') = -1, 'StrCompareNoCase');
  24565. Assert(StrCompareNoAsciiCaseU('B', 'aa') = 1, 'StrCompareNoCase');
  24566. Assert(StrCompareNoAsciiCaseU('aa', 'Aa') = 0, 'StrCompareNoCase');
  24567. Assert(StrCompareU('A', 'a') = -1, 'StrCompareNoCase');
  24568. Assert(StrCompareU('a', 'A') = 1, 'StrCompareNoCase');
  24569. Assert(StrCompareU('a', 'aa') = -1, 'StrCompareNoCase');
  24570. Assert(StrCompareU('', '') = 0, 'StrCompareNoCase');
  24571. Assert(StrCompareU('', 'a') = -1, 'StrCompareNoCase');
  24572. Assert(StrCompareU('a', '') = 1, 'StrCompareNoCase');
  24573. Assert(StrCompareNoAsciiCase('a', 'a') = 0, 'StrCompareNoCase');
  24574. Assert(StrCompareNoAsciiCase('a', 'b') = -1, 'StrCompareNoCase');
  24575. Assert(StrCompareNoAsciiCase('b', 'a') = 1, 'StrCompareNoCase');
  24576. Assert(StrCompareNoAsciiCase('A', 'a') = 0, 'StrCompareNoCase');
  24577. Assert(StrCompareNoAsciiCase('A', 'b') = -1, 'StrCompareNoCase');
  24578. Assert(StrCompareNoAsciiCase('b', 'A') = 1, 'StrCompareNoCase');
  24579. Assert(StrCompareNoAsciiCase('aa', 'a') = 1, 'StrCompareNoCase');
  24580. Assert(StrCompareNoAsciiCase('a', 'aa') = -1, 'StrCompareNoCase');
  24581. Assert(StrCompareNoAsciiCase('AA', 'b') = -1, 'StrCompareNoCase');
  24582. Assert(StrCompareNoAsciiCase('B', 'aa') = 1, 'StrCompareNoCase');
  24583. Assert(StrCompareNoAsciiCase('aa', 'Aa') = 0, 'StrCompareNoCase');
  24584. Assert(StrCompare('A', 'a') = -1, 'StrCompareNoCase');
  24585. Assert(StrCompare('a', 'A') = 1, 'StrCompareNoCase');
  24586. Assert(StrCompare('a', 'aa') = -1, 'StrCompareNoCase');
  24587. Assert(StrCompare('', '') = 0, 'StrCompareNoCase');
  24588. Assert(StrCompare('', 'a') = -1, 'StrCompareNoCase');
  24589. Assert(StrCompare('a', '') = 1, 'StrCompareNoCase');
  24590. { Match }
  24591. Assert(not StrMatchA('', '', 1), 'StrMatch');
  24592. Assert(not StrMatchA('', 'a', 1), 'StrMatch');
  24593. Assert(not StrMatchA('a', '', 1), 'StrMatch');
  24594. Assert(not StrMatchA('a', 'A', 1), 'StrMatch');
  24595. Assert(StrMatchA('A', 'A', 1), 'StrMatch');
  24596. Assert(not StrMatchA('abcdef', 'xx', 1), 'StrMatch');
  24597. Assert(StrMatchA('xbcdef', 'x', 1), 'StrMatch');
  24598. Assert(StrMatchA('abcdxxxxx', 'xxxxx', 5), 'StrMatch');
  24599. Assert(StrMatchA('abcdef', 'abcdef', 1), 'StrMatch');
  24600. Assert(not StrMatchNoAsciiCaseA('abcdef', 'xx', 1), 'StrMatchNoCase');
  24601. Assert(StrMatchNoAsciiCaseA('xbCDef', 'xBCd', 1), 'StrMatchNoCase');
  24602. Assert(StrMatchNoAsciiCaseA('abcdxxX-xx', 'Xxx-xX', 5), 'StrMatchNoCase');
  24603. Assert(StrMatchA('abcde', 'abcd', 1), 'StrMatch');
  24604. Assert(StrMatchA('abcde', 'abc', 1), 'StrMatch');
  24605. Assert(StrMatchA('abcde', 'ab', 1), 'StrMatch');
  24606. Assert(StrMatchA('abcde', 'a', 1), 'StrMatch');
  24607. Assert(StrMatchNoAsciiCaseA(' abC-Def{', ' AbC-def{', 1), 'StrMatchNoCase');
  24608. Assert(StrMatchLeftA('ABC1D', 'aBc1', False), 'StrMatchLeft');
  24609. Assert(StrMatchLeftA('aBc1D', 'aBc1', True), 'StrMatchLeft');
  24610. Assert(not StrMatchLeftA('AB1D', 'ABc1', False), 'StrMatchLeft');
  24611. Assert(not StrMatchLeftA('aBC1D', 'aBc1', True), 'StrMatchLeft');
  24612. Assert(not StrMatchCharA('', ['a', 'b', 'c']), 'StrMatchChar');
  24613. Assert(StrMatchCharA('a', ['a', 'b', 'c']), 'StrMatchChar');
  24614. Assert(not StrMatchCharA('d', ['a', 'b', 'c']), 'StrMatchChar');
  24615. Assert(StrMatchCharA('acbba', ['a', 'b', 'c']), 'StrMatchChar');
  24616. Assert(not StrMatchCharA('acbd', ['a', 'b', 'c']), 'StrMatchChar');
  24617. Assert(StrMatchLenA('abcd', ['a', 'b', 'c'], 1) = 3, 'StrMatchLen');
  24618. Assert(StrMatchLenA('abcd', ['a', 'b', 'c'], 3) = 1, 'StrMatchLen');
  24619. Assert(StrMatchLenA('abcd', ['a', 'b', 'c'], 4) = 0, 'StrMatchLen');
  24620. Assert(StrMatchLenA('', ['a', 'b', 'c'], 1) = 0, 'StrMatchLen');
  24621. Assert(StrMatchLenA('dcba', ['a', 'b', 'c'], 2) = 3, 'StrMatchLen');
  24622. Assert(StrMatchLenA('dcba', ['a', 'b', 'c'], 1) = 0, 'StrMatchLen');
  24623. Assert(not StrMatchW('', '', 1), 'StrMatch');
  24624. Assert(not StrMatchW('', 'a', 1), 'StrMatch');
  24625. Assert(not StrMatchW('a', '', 1), 'StrMatch');
  24626. Assert(not StrMatchW('a', 'A', 1), 'StrMatch');
  24627. Assert(StrMatchW('A', 'A', 1), 'StrMatch');
  24628. Assert(not StrMatchW('abcdef', 'xx', 1), 'StrMatch');
  24629. Assert(StrMatchW('xbcdef', 'x', 1), 'StrMatch');
  24630. Assert(StrMatchW('abcdxxxxx', 'xxxxx', 5), 'StrMatch');
  24631. Assert(StrMatchW('abcdef', 'abcdef', 1), 'StrMatch');
  24632. Assert(not StrMatchNoAsciiCaseW('abcdef', 'xx', 1), 'StrMatchNoCase');
  24633. Assert(StrMatchNoAsciiCaseW('xbCDef', 'xBCd', 1), 'StrMatchNoCase');
  24634. Assert(StrMatchNoAsciiCaseW('abcdxxX-xx', 'Xxx-xX', 5), 'StrMatchNoCase');
  24635. Assert(StrMatchW('abcde', 'abcd', 1), 'StrMatch');
  24636. Assert(StrMatchW('abcde', 'abc', 1), 'StrMatch');
  24637. Assert(StrMatchW('abcde', 'ab', 1), 'StrMatch');
  24638. Assert(StrMatchW('abcde', 'a', 1), 'StrMatch');
  24639. Assert(StrMatchNoAsciiCaseW(' abC-Def{', ' AbC-def{', 1), 'StrMatchNoCase');
  24640. Assert(StrMatchLeftW('ABC1D', 'aBc1', False), 'StrMatchLeft');
  24641. Assert(StrMatchLeftW('aBc1D', 'aBc1', True), 'StrMatchLeft');
  24642. Assert(not StrMatchLeftW('AB1D', 'ABc1', False), 'StrMatchLeft');
  24643. Assert(not StrMatchLeftW('aBC1D', 'aBc1', True), 'StrMatchLeft');
  24644. Assert(not StrMatchCharW('', ['a', 'b', 'c']), 'StrMatchChar');
  24645. Assert(StrMatchCharW('a', ['a', 'b', 'c']), 'StrMatchChar');
  24646. Assert(not StrMatchCharW('d', ['a', 'b', 'c']), 'StrMatchChar');
  24647. Assert(StrMatchCharW('acbba', ['a', 'b', 'c']), 'StrMatchChar');
  24648. Assert(not StrMatchCharW('acbd', ['a', 'b', 'c']), 'StrMatchChar');
  24649. Assert(StrMatchLenW('abcd', ['a', 'b', 'c'], 1) = 3, 'StrMatchLen');
  24650. Assert(StrMatchLenW('abcd', ['a', 'b', 'c'], 3) = 1, 'StrMatchLen');
  24651. Assert(StrMatchLenW('abcd', ['a', 'b', 'c'], 4) = 0, 'StrMatchLen');
  24652. Assert(StrMatchLenW('', ['a', 'b', 'c'], 1) = 0, 'StrMatchLen');
  24653. Assert(StrMatchLenW('dcba', ['a', 'b', 'c'], 2) = 3, 'StrMatchLen');
  24654. Assert(StrMatchLenW('dcba', ['a', 'b', 'c'], 1) = 0, 'StrMatchLen');
  24655. Assert(not StrMatchU('', '', 1), 'StrMatch');
  24656. Assert(not StrMatchU('', 'a', 1), 'StrMatch');
  24657. Assert(not StrMatchU('a', '', 1), 'StrMatch');
  24658. Assert(not StrMatchU('a', 'A', 1), 'StrMatch');
  24659. Assert(StrMatchU('A', 'A', 1), 'StrMatch');
  24660. Assert(not StrMatchU('abcdef', 'xx', 1), 'StrMatch');
  24661. Assert(StrMatchU('xbcdef', 'x', 1), 'StrMatch');
  24662. Assert(StrMatchU('abcdxxxxx', 'xxxxx', 5), 'StrMatch');
  24663. Assert(StrMatchU('abcdef', 'abcdef', 1), 'StrMatch');
  24664. Assert(not StrMatchNoAsciiCaseU('abcdef', 'xx', 1), 'StrMatchNoCase');
  24665. Assert(StrMatchNoAsciiCaseU('xbCDef', 'xBCd', 1), 'StrMatchNoCase');
  24666. Assert(StrMatchNoAsciiCaseU('abcdxxX-xx', 'Xxx-xX', 5), 'StrMatchNoCase');
  24667. Assert(StrMatchU('abcde', 'abcd', 1), 'StrMatch');
  24668. Assert(StrMatchU('abcde', 'abc', 1), 'StrMatch');
  24669. Assert(StrMatchU('abcde', 'ab', 1), 'StrMatch');
  24670. Assert(StrMatchU('abcde', 'a', 1), 'StrMatch');
  24671. Assert(StrMatchNoAsciiCaseU(' abC-Def{', ' AbC-def{', 1), 'StrMatchNoCase');
  24672. Assert(StrMatchLeftU('ABC1D', 'aBc1', False), 'StrMatchLeft');
  24673. Assert(StrMatchLeftU('aBc1D', 'aBc1', True), 'StrMatchLeft');
  24674. Assert(not StrMatchLeftU('AB1D', 'ABc1', False), 'StrMatchLeft');
  24675. Assert(not StrMatchLeftU('aBC1D', 'aBc1', True), 'StrMatchLeft');
  24676. Assert(not StrMatchCharU('', ['a', 'b', 'c']), 'StrMatchChar');
  24677. Assert(StrMatchCharU('a', ['a', 'b', 'c']), 'StrMatchChar');
  24678. Assert(not StrMatchCharU('d', ['a', 'b', 'c']), 'StrMatchChar');
  24679. Assert(StrMatchCharU('acbba', ['a', 'b', 'c']), 'StrMatchChar');
  24680. Assert(not StrMatchCharU('acbd', ['a', 'b', 'c']), 'StrMatchChar');
  24681. Assert(StrMatchLenU('abcd', ['a', 'b', 'c'], 1) = 3, 'StrMatchLen');
  24682. Assert(StrMatchLenU('abcd', ['a', 'b', 'c'], 3) = 1, 'StrMatchLen');
  24683. Assert(StrMatchLenU('abcd', ['a', 'b', 'c'], 4) = 0, 'StrMatchLen');
  24684. Assert(StrMatchLenU('', ['a', 'b', 'c'], 1) = 0, 'StrMatchLen');
  24685. Assert(StrMatchLenU('dcba', ['a', 'b', 'c'], 2) = 3, 'StrMatchLen');
  24686. Assert(StrMatchLenU('dcba', ['a', 'b', 'c'], 1) = 0, 'StrMatchLen');
  24687. Assert(not StrMatch('', '', 1), 'StrMatch');
  24688. Assert(not StrMatch('', 'a', 1), 'StrMatch');
  24689. Assert(not StrMatch('a', '', 1), 'StrMatch');
  24690. Assert(not StrMatch('a', 'A', 1), 'StrMatch');
  24691. Assert(StrMatch('A', 'A', 1), 'StrMatch');
  24692. Assert(not StrMatch('abcdef', 'xx', 1), 'StrMatch');
  24693. Assert(StrMatch('xbcdef', 'x', 1), 'StrMatch');
  24694. Assert(StrMatch('abcdxxxxx', 'xxxxx', 5), 'StrMatch');
  24695. Assert(StrMatch('abcdef', 'abcdef', 1), 'StrMatch');
  24696. Assert(not StrMatchNoAsciiCase('abcdef', 'xx', 1), 'StrMatchNoCase');
  24697. Assert(StrMatchNoAsciiCase('xbCDef', 'xBCd', 1), 'StrMatchNoCase');
  24698. Assert(StrMatchNoAsciiCase('abcdxxX-xx', 'Xxx-xX', 5), 'StrMatchNoCase');
  24699. Assert(StrMatch('abcde', 'abcd', 1), 'StrMatch');
  24700. Assert(StrMatch('abcde', 'abc', 1), 'StrMatch');
  24701. Assert(StrMatch('abcde', 'ab', 1), 'StrMatch');
  24702. Assert(StrMatch('abcde', 'a', 1), 'StrMatch');
  24703. Assert(StrMatchNoAsciiCase(' abC-Def{', ' AbC-def{', 1), 'StrMatchNoCase');
  24704. Assert(StrMatchLeft('ABC1D', 'aBc1', False), 'StrMatchLeft');
  24705. Assert(StrMatchLeft('aBc1D', 'aBc1', True), 'StrMatchLeft');
  24706. Assert(not StrMatchLeft('AB1D', 'ABc1', False), 'StrMatchLeft');
  24707. Assert(not StrMatchLeft('aBC1D', 'aBc1', True), 'StrMatchLeft');
  24708. Assert(not StrMatchChar('', ['a', 'b', 'c']), 'StrMatchChar');
  24709. Assert(StrMatchChar('a', ['a', 'b', 'c']), 'StrMatchChar');
  24710. Assert(not StrMatchChar('d', ['a', 'b', 'c']), 'StrMatchChar');
  24711. Assert(StrMatchChar('acbba', ['a', 'b', 'c']), 'StrMatchChar');
  24712. Assert(not StrMatchChar('acbd', ['a', 'b', 'c']), 'StrMatchChar');
  24713. Assert(StrMatchLen('abcd', ['a', 'b', 'c'], 1) = 3, 'StrMatchLen');
  24714. Assert(StrMatchLen('abcd', ['a', 'b', 'c'], 3) = 1, 'StrMatchLen');
  24715. Assert(StrMatchLen('abcd', ['a', 'b', 'c'], 4) = 0, 'StrMatchLen');
  24716. Assert(StrMatchLen('', ['a', 'b', 'c'], 1) = 0, 'StrMatchLen');
  24717. Assert(StrMatchLen('dcba', ['a', 'b', 'c'], 2) = 3, 'StrMatchLen');
  24718. Assert(StrMatchLen('dcba', ['a', 'b', 'c'], 1) = 0, 'StrMatchLen');
  24719. { Pos }
  24720. Assert(PosStrA('', 'ABCABC') = 0, 'PosStr');
  24721. Assert(PosStrA('', 'a') = 0, 'PosStr');
  24722. Assert(PosStrA('A', '') = 0, 'PosStr');
  24723. Assert(PosStrA('A', 'ABCABC') = 1, 'PosStr');
  24724. Assert(PosStrA('A', 'ABCABC', 2) = 4, 'PosStr');
  24725. Assert(PosStrA('ab', 'a') = 0, 'PosStr');
  24726. Assert(PosStrA('ab', 'ab') = 1, 'PosStr');
  24727. Assert(PosStrA('ab', 'zxab') = 3, 'PosStr');
  24728. Assert(PosStrA('ab', '') = 0, 'PosStr');
  24729. Assert(PosStrA('ab', 'axdba') = 0, 'PosStr');
  24730. Assert(PosStrA('a', 'AbAc', 1, False) = 1, 'PosStr');
  24731. Assert(PosStrA('ba', 'ABAcabac', 1, False) = 2, 'PosStr');
  24732. Assert(PosStrA('a', 'abac', 2) = 3, 'PosStr');
  24733. Assert(PosStrA('ab', 'abacabac', 2) = 5, 'PosStr');
  24734. Assert(PosStrRevA('A', 'ABCABC') = 4, 'PosStrRev');
  24735. Assert(PosStrRevA('A', 'ABCABCA') = 7, 'PosStrRev');
  24736. Assert(PosStrRevA('CA', 'ABCABCA') = 6, 'PosStrRev');
  24737. Assert(PosStrRevA('ab', 'abacabac') = 5, 'PosStrRev');
  24738. Assert(PosNStrA('AB', 'ABCABCDAB', 3) = 8, 'PosNStr');
  24739. Assert(PosCharSetA([], 'a') = 0, 'PosChar');
  24740. Assert(PosCharSetA(['a'], 'a') = 1, 'PosChar');
  24741. Assert(PosCharSetA(['a'], '') = 0, 'PosChar');
  24742. Assert(PosCharSetA(['a'], 'aa') = 1, 'PosChar');
  24743. Assert(PosCharSetA(['a'], 'ba') = 2, 'PosChar');
  24744. Assert(PosCharSetA(['a'], 'zx') = 0, 'PosChar');
  24745. Assert(PosCharA(AnsiChar('a'), 'a') = 1, 'PosChar');
  24746. Assert(PosCharA(AnsiChar('a'), '') = 0, 'PosChar');
  24747. Assert(PosCharA(AnsiChar('a'), 'aa') = 1, 'PosChar');
  24748. Assert(PosCharA(AnsiChar('a'), 'ba') = 2, 'PosChar');
  24749. Assert(PosCharA(AnsiChar('a'), 'zx') = 0, 'PosChar');
  24750. Assert(PosCharSetA(['a'], 'abac', 2) = 3, 'PosChar');
  24751. Assert(PosCharRevA(AnsiChar('a'), 'abac') = 3, 'PosCharRev');
  24752. Assert(PosCharSetRevA(['a'..'z'], 'abac') = 4, 'PosCharRev');
  24753. Assert(PosNotCharA(AnsiChar('a'), 'abac') = 2, 'PosNotChar');
  24754. Assert(PosNotCharSetA(['a'..'z'], 'abac1a') = 5, 'PosNotChar');
  24755. Assert(PosStrW('', 'ABCABC') = 0, 'PosStr');
  24756. Assert(PosStrW('', 'a') = 0, 'PosStr');
  24757. Assert(PosStrW('A', '') = 0, 'PosStr');
  24758. Assert(PosStrW('A', 'ABCABC') = 1, 'PosStr');
  24759. Assert(PosStrW('A', 'ABCABC', 2) = 4, 'PosStr');
  24760. Assert(PosStrW('ab', 'a') = 0, 'PosStr');
  24761. Assert(PosStrW('ab', 'ab') = 1, 'PosStr');
  24762. Assert(PosStrW('ab', 'zxab') = 3, 'PosStr');
  24763. Assert(PosStrW('ab', '') = 0, 'PosStr');
  24764. Assert(PosStrW('ab', 'axdba') = 0, 'PosStr');
  24765. Assert(PosStrW('a', 'AbAc', 1, False) = 1, 'PosStr');
  24766. Assert(PosStrW('ba', 'ABAcabac', 1, False) = 2, 'PosStr');
  24767. Assert(PosStrW('a', 'abac', 2) = 3, 'PosStr');
  24768. Assert(PosStrW('ab', 'abacabac', 2) = 5, 'PosStr');
  24769. Assert(PosStrRevW('A', 'ABCABC') = 4, 'PosStrRev');
  24770. Assert(PosStrRevW('A', 'ABCABCA') = 7, 'PosStrRev');
  24771. Assert(PosStrRevW('CA', 'ABCABCA') = 6, 'PosStrRev');
  24772. Assert(PosStrRevW('ab', 'abacabac') = 5, 'PosStrRev');
  24773. Assert(PosNStrW('AB', 'ABCABCDAB', 3) = 8, 'PosNStr');
  24774. Assert(PosCharSetW([], 'a') = 0, 'PosChar');
  24775. Assert(PosCharSetW(['a'], 'a') = 1, 'PosChar');
  24776. Assert(PosCharSetW(['a'], '') = 0, 'PosChar');
  24777. Assert(PosCharSetW(['a'], 'aa') = 1, 'PosChar');
  24778. Assert(PosCharSetW(['a'], 'ba') = 2, 'PosChar');
  24779. Assert(PosCharSetW(['a'], 'zx') = 0, 'PosChar');
  24780. Assert(PosCharW(AnsiChar('a'), 'a') = 1, 'PosChar');
  24781. Assert(PosCharW(AnsiChar('a'), '') = 0, 'PosChar');
  24782. Assert(PosCharW(AnsiChar('a'), 'aa') = 1, 'PosChar');
  24783. Assert(PosCharW(AnsiChar('a'), 'ba') = 2, 'PosChar');
  24784. Assert(PosCharW(AnsiChar('a'), 'zx') = 0, 'PosChar');
  24785. Assert(PosCharSetW(['a'], 'abac', 2) = 3, 'PosChar');
  24786. Assert(PosCharRevW(AnsiChar('a'), 'abac') = 3, 'PosCharRev');
  24787. Assert(PosCharSetRevW(['a'..'z'], 'abac') = 4, 'PosCharRev');
  24788. Assert(PosNotCharW(AnsiChar('a'), 'abac') = 2, 'PosNotChar');
  24789. Assert(PosNotCharSetW(['a'..'z'], 'abac1a') = 5, 'PosNotChar');
  24790. Assert(PosStrU('', 'ABCABC') = 0, 'PosStr');
  24791. Assert(PosStrU('', 'a') = 0, 'PosStr');
  24792. Assert(PosStrU('A', '') = 0, 'PosStr');
  24793. Assert(PosStrU('A', 'ABCABC') = 1, 'PosStr');
  24794. Assert(PosStrU('A', 'ABCABC', 2) = 4, 'PosStr');
  24795. Assert(PosStrU('ab', 'a') = 0, 'PosStr');
  24796. Assert(PosStrU('ab', 'ab') = 1, 'PosStr');
  24797. Assert(PosStrU('ab', 'zxab') = 3, 'PosStr');
  24798. Assert(PosStrU('ab', '') = 0, 'PosStr');
  24799. Assert(PosStrU('ab', 'axdba') = 0, 'PosStr');
  24800. Assert(PosStrU('a', 'AbAc', 1, False) = 1, 'PosStr');
  24801. Assert(PosStrU('ba', 'ABAcabac', 1, False) = 2, 'PosStr');
  24802. Assert(PosStrU('a', 'abac', 2) = 3, 'PosStr');
  24803. Assert(PosStrU('ab', 'abacabac', 2) = 5, 'PosStr');
  24804. Assert(PosStrRevU('A', 'ABCABC') = 4, 'PosStrRev');
  24805. Assert(PosStrRevU('A', 'ABCABCA') = 7, 'PosStrRev');
  24806. Assert(PosStrRevU('CA', 'ABCABCA') = 6, 'PosStrRev');
  24807. Assert(PosStrRevU('ab', 'abacabac') = 5, 'PosStrRev');
  24808. Assert(PosNStrU('AB', 'ABCABCDAB', 3) = 8, 'PosNStr');
  24809. Assert(PosCharSetU([], 'a') = 0, 'PosChar');
  24810. Assert(PosCharSetU(['a'], 'a') = 1, 'PosChar');
  24811. Assert(PosCharSetU(['a'], '') = 0, 'PosChar');
  24812. Assert(PosCharSetU(['a'], 'aa') = 1, 'PosChar');
  24813. Assert(PosCharSetU(['a'], 'ba') = 2, 'PosChar');
  24814. Assert(PosCharSetU(['a'], 'zx') = 0, 'PosChar');
  24815. Assert(PosCharU(AnsiChar('a'), 'a') = 1, 'PosChar');
  24816. Assert(PosCharU(AnsiChar('a'), '') = 0, 'PosChar');
  24817. Assert(PosCharU(AnsiChar('a'), 'aa') = 1, 'PosChar');
  24818. Assert(PosCharU(AnsiChar('a'), 'ba') = 2, 'PosChar');
  24819. Assert(PosCharU(AnsiChar('a'), 'zx') = 0, 'PosChar');
  24820. Assert(PosCharSetU(['a'], 'abac', 2) = 3, 'PosChar');
  24821. Assert(PosCharRevU(AnsiChar('a'), 'abac') = 3, 'PosCharRev');
  24822. Assert(PosCharSetRevU(['a'..'z'], 'abac') = 4, 'PosCharRev');
  24823. Assert(PosNotCharU(AnsiChar('a'), 'abac') = 2, 'PosNotChar');
  24824. Assert(PosNotCharSetU(['a'..'z'], 'abac1a') = 5, 'PosNotChar');
  24825. Assert(PosStr('', 'ABCABC') = 0, 'PosStr');
  24826. Assert(PosStr('', 'a') = 0, 'PosStr');
  24827. Assert(PosStr('A', '') = 0, 'PosStr');
  24828. Assert(PosStr('A', 'ABCABC') = 1, 'PosStr');
  24829. Assert(PosStr('A', 'ABCABC', 2) = 4, 'PosStr');
  24830. Assert(PosStr('ab', 'a') = 0, 'PosStr');
  24831. Assert(PosStr('ab', 'ab') = 1, 'PosStr');
  24832. Assert(PosStr('ab', 'zxab') = 3, 'PosStr');
  24833. Assert(PosStr('ab', '') = 0, 'PosStr');
  24834. Assert(PosStr('ab', 'axdba') = 0, 'PosStr');
  24835. Assert(PosStr('a', 'AbAc', 1, False) = 1, 'PosStr');
  24836. Assert(PosStr('ba', 'ABAcabac', 1, False) = 2, 'PosStr');
  24837. Assert(PosStr('a', 'abac', 2) = 3, 'PosStr');
  24838. Assert(PosStr('ab', 'abacabac', 2) = 5, 'PosStr');
  24839. Assert(PosStrRev('A', 'ABCABC') = 4, 'PosStrRev');
  24840. Assert(PosStrRev('A', 'ABCABCA') = 7, 'PosStrRev');
  24841. Assert(PosStrRev('CA', 'ABCABCA') = 6, 'PosStrRev');
  24842. Assert(PosStrRev('ab', 'abacabac') = 5, 'PosStrRev');
  24843. Assert(PosNStr('AB', 'ABCABCDAB', 3) = 8, 'PosNStr');
  24844. Assert(PosCharSet([], 'a') = 0, 'PosChar');
  24845. Assert(PosCharSet(['a'], 'a') = 1, 'PosChar');
  24846. Assert(PosCharSet(['a'], '') = 0, 'PosChar');
  24847. Assert(PosCharSet(['a'], 'aa') = 1, 'PosChar');
  24848. Assert(PosCharSet(['a'], 'ba') = 2, 'PosChar');
  24849. Assert(PosCharSet(['a'], 'zx') = 0, 'PosChar');
  24850. Assert(PosChar(AnsiChar('a'), 'a') = 1, 'PosChar');
  24851. Assert(PosChar(AnsiChar('a'), '') = 0, 'PosChar');
  24852. Assert(PosChar(AnsiChar('a'), 'aa') = 1, 'PosChar');
  24853. Assert(PosChar(AnsiChar('a'), 'ba') = 2, 'PosChar');
  24854. Assert(PosChar(AnsiChar('a'), 'zx') = 0, 'PosChar');
  24855. Assert(PosCharSet(['a'], 'abac', 2) = 3, 'PosChar');
  24856. Assert(PosCharRev(AnsiChar('a'), 'abac') = 3, 'PosCharRev');
  24857. Assert(PosCharSetRev(['a'..'z'], 'abac') = 4, 'PosCharRev');
  24858. Assert(PosNotChar(AnsiChar('a'), 'abac') = 2, 'PosNotChar');
  24859. Assert(PosNotCharSet(['a'..'z'], 'abac1a') = 5, 'PosNotChar');
  24860. Assert(PosStrW('AB', 'XYZABCAACDEF', 1) = 4, 'PosStrW');
  24861. Assert(PosStrW('AA', 'XYZABCAACDEF', 1) = 7, 'PosStrW');
  24862. Assert(PosStrW('A', 'XYZABCAACDEF', 8) = 8, 'PosStrW');
  24863. Assert(PosStrW('AA', 'XYZABCAACDEF', 8) = 0, 'PosStrW');
  24864. Assert(PosStrW('AAQ', 'XYZABCAACDEF', 1) = 0, 'PosStrW');
  24865. Assert(PosCharW(WideChar('A'), 'XYZABCAACDEF', 1) = 4, 'PosCharW');
  24866. Assert(PosCharW(WideChar('A'), 'XYZABCAACDEF', 5) = 7, 'PosCharW');
  24867. Assert(PosCharW(WideChar('A'), 'XYZABCAACDEF', 8) = 8, 'PosCharW');
  24868. Assert(PosCharW(WideChar('A'), 'XYZABCAACDEF', 9) = 0, 'PosCharW');
  24869. Assert(PosCharW(WideChar('Q'), 'XYZABCAACDEF', 1) = 0, 'PosCharW');
  24870. { Trim }
  24871. {$IFNDEF CLR}
  24872. Assert(StrTrimLeftA(' 123 ') = '123 ', 'TrimLeft');
  24873. Assert(StrTrimLeftStrNoCaseA(' 123 ', ' ') = ' 123 ', 'TrimLeftStrNoCase');
  24874. Assert(StrTrimRightA(' 123 ') = ' 123', 'TrimRight');
  24875. Assert(StrTrimRightStrNoCaseA(' 123 ', ' ') = ' 123 ', 'TrimRightStrNoCase');
  24876. Assert(StrTrimA(' 123 ', [' ']) = '123', 'Trim');
  24877. Assert(StrTrimA('', [' ']) = '', 'Trim');
  24878. Assert(StrTrimA('X', [' ']) = 'X', 'Trim');
  24879. Assert(StrTrimLeftW(' 123 ') = '123 ', 'TrimLeft');
  24880. Assert(StrTrimLeftStrNoCaseW(' 123 ', ' ') = ' 123 ', 'TrimLeftStrNoCase');
  24881. Assert(StrTrimRightW(' 123 ') = ' 123', 'TrimRight');
  24882. Assert(StrTrimRightStrNoCaseW(' 123 ', ' ') = ' 123 ', 'TrimRightStrNoCase');
  24883. Assert(StrTrimW(' 123 ', [' ']) = '123', 'Trim');
  24884. Assert(StrTrimW('', [' ']) = '', 'Trim');
  24885. Assert(StrTrimW('X', [' ']) = 'X', 'Trim');
  24886. Assert(StrTrimLeftU(' 123 ') = '123 ', 'TrimLeft');
  24887. Assert(StrTrimLeftStrNoCaseU(' 123 ', ' ') = ' 123 ', 'TrimLeftStrNoCase');
  24888. Assert(StrTrimRightU(' 123 ') = ' 123', 'TrimRight');
  24889. Assert(StrTrimRightStrNoCaseU(' 123 ', ' ') = ' 123 ', 'TrimRightStrNoCase');
  24890. Assert(StrTrimU(' 123 ', [' ']) = '123', 'Trim');
  24891. Assert(StrTrimU('', [' ']) = '', 'Trim');
  24892. Assert(StrTrimU('X', [' ']) = 'X', 'Trim');
  24893. Assert(StrTrimLeft(' 123 ') = '123 ', 'TrimLeft');
  24894. Assert(StrTrimLeftStrNoCase(' 123 ', ' ') = ' 123 ', 'TrimLeftStrNoCase');
  24895. Assert(StrTrimRight(' 123 ') = ' 123', 'TrimRight');
  24896. Assert(StrTrimRightStrNoCase(' 123 ', ' ') = ' 123 ', 'TrimRightStrNoCase');
  24897. Assert(StrTrim(' 123 ', [' ']) = '123', 'Trim');
  24898. Assert(StrTrim('', [' ']) = '', 'Trim');
  24899. Assert(StrTrim('X', [' ']) = 'X', 'Trim');
  24900. Assert(StrTrimLeftU(' X ') = 'X ', 'StrTrimLeft');
  24901. Assert(StrTrimRightU(' X ') = ' X', 'StrTrimRight');
  24902. Assert(StrTrimU(' X ') = 'X', 'StrTrim');
  24903. {$ENDIF}
  24904. { Dup }
  24905. Assert(DupStrA('xy', 3) = 'xyxyxy', 'Dup');
  24906. Assert(DupStrA('', 3) = '', 'Dup');
  24907. Assert(DupStrA('a', 0) = '', 'Dup');
  24908. Assert(DupStrA('a', -1) = '', 'Dup');
  24909. C := 'x';
  24910. Assert(DupCharA(C, 6) = 'xxxxxx', 'Dup');
  24911. Assert(DupCharA(C, 0) = '', 'Dup');
  24912. Assert(DupCharA(C, -1) = '', 'Dup');
  24913. Assert(DupStrW('xy', 3) = 'xyxyxy', 'Dup');
  24914. Assert(DupStrW('', 3) = '', 'Dup');
  24915. Assert(DupStrW('a', 0) = '', 'Dup');
  24916. Assert(DupStrW('a', -1) = '', 'Dup');
  24917. D := 'x';
  24918. Assert(DupCharW(D, 6) = 'xxxxxx', 'Dup');
  24919. Assert(DupCharW(D, 0) = '', 'Dup');
  24920. Assert(DupCharW(D, -1) = '', 'Dup');
  24921. Assert(DupStrU('xy', 3) = 'xyxyxy', 'Dup');
  24922. Assert(DupStrU('', 3) = '', 'Dup');
  24923. Assert(DupStrU('a', 0) = '', 'Dup');
  24924. Assert(DupStrU('a', -1) = '', 'Dup');
  24925. D := 'x';
  24926. Assert(DupCharU(D, 6) = 'xxxxxx', 'Dup');
  24927. Assert(DupCharU(D, 0) = '', 'Dup');
  24928. Assert(DupCharU(D, -1) = '', 'Dup');
  24929. Assert(DupStr('xy', 3) = 'xyxyxy', 'Dup');
  24930. Assert(DupStr('', 3) = '', 'Dup');
  24931. Assert(DupStr('a', 0) = '', 'Dup');
  24932. Assert(DupStr('a', -1) = '', 'Dup');
  24933. E := 'x';
  24934. Assert(DupChar(E, 6) = 'xxxxxx', 'Dup');
  24935. Assert(DupChar(E, 0) = '', 'Dup');
  24936. Assert(DupChar(E, -1) = '', 'Dup');
  24937. { Pad }
  24938. Assert(StrPadLeftA('xxx', 'y', 6) = 'yyyxxx', 'PadLeft');
  24939. Assert(StrPadLeftA('xxx', 'y', 2, True) = 'xx', 'PadLeft');
  24940. Assert(StrPadLeftA('x', ' ', 3, True) = ' x', 'PadLeft');
  24941. Assert(StrPadLeftA('xabc', ' ', 3, True) = 'xab', 'PadLeft');
  24942. Assert(StrPadRightA('xxx', 'y', 6) = 'xxxyyy', 'PadRight');
  24943. Assert(StrPadRightA('xxx', 'y', 2, True) = 'xx', 'PadRight');
  24944. Assert(StrPadA('xxx', 'y', 7) = 'yyxxxyy', 'Pad');
  24945. Assert(StrPadLeftW('xxx', 'y', 6) = 'yyyxxx', 'PadLeft');
  24946. Assert(StrPadLeftW('xxx', 'y', 2, True) = 'xx', 'PadLeft');
  24947. Assert(StrPadLeftW('x', ' ', 3, True) = ' x', 'PadLeft');
  24948. Assert(StrPadLeftW('xabc', ' ', 3, True) = 'xab', 'PadLeft');
  24949. Assert(StrPadRightW('xxx', 'y', 6) = 'xxxyyy', 'PadRight');
  24950. Assert(StrPadRightW('xxx', 'y', 2, True) = 'xx', 'PadRight');
  24951. Assert(StrPadW('xxx', 'y', 7) = 'yyxxxyy', 'Pad');
  24952. Assert(StrPadLeftU('xxx', 'y', 6) = 'yyyxxx', 'PadLeft');
  24953. Assert(StrPadLeftU('xxx', 'y', 2, True) = 'xx', 'PadLeft');
  24954. Assert(StrPadLeftU('x', ' ', 3, True) = ' x', 'PadLeft');
  24955. Assert(StrPadLeftU('xabc', ' ', 3, True) = 'xab', 'PadLeft');
  24956. Assert(StrPadRightU('xxx', 'y', 6) = 'xxxyyy', 'PadRight');
  24957. Assert(StrPadRightU('xxx', 'y', 2, True) = 'xx', 'PadRight');
  24958. Assert(StrPadU('xxx', 'y', 7) = 'yyxxxyy', 'Pad');
  24959. Assert(StrPadLeft('xxx', 'y', 6) = 'yyyxxx', 'PadLeft');
  24960. Assert(StrPadLeft('xxx', 'y', 2, True) = 'xx', 'PadLeft');
  24961. Assert(StrPadLeft('x', ' ', 3, True) = ' x', 'PadLeft');
  24962. Assert(StrPadLeft('xabc', ' ', 3, True) = 'xab', 'PadLeft');
  24963. Assert(StrPadRight('xxx', 'y', 6) = 'xxxyyy', 'PadRight');
  24964. Assert(StrPadRight('xxx', 'y', 2, True) = 'xx', 'PadRight');
  24965. Assert(StrPad('xxx', 'y', 7) = 'yyxxxyy', 'Pad');
  24966. { Prefix/Suffix }
  24967. S := 'ABC';
  24968. StrEnsurePrefixA(S, '\');
  24969. Assert(S = '\ABC', 'StrEnsurePrefix');
  24970. StrEnsureSuffixA(S, '\');
  24971. Assert(S = '\ABC\', 'StrEnsureSuffix');
  24972. StrEnsureNoPrefixA(S, '\');
  24973. Assert(S = 'ABC\', 'StrEnsureNoPrefix');
  24974. StrEnsureNoSuffixA(S, '\');
  24975. Assert(S = 'ABC', 'StrEnsureNoSuffix');
  24976. for I := 0 to 256 do
  24977. begin
  24978. T := DupCharA('A', I);
  24979. S := T;
  24980. StrEnsurePrefixA(S, '\');
  24981. Assert(S = '\' + T, 'StrEnsurePrefix');
  24982. StrEnsureNoPrefixA(S, '\');
  24983. Assert(S = T, 'StrEnsureNoPrefix');
  24984. StrEnsureSuffixA(S, '\');
  24985. Assert(S = T + '\', 'StrEnsureSuffix');
  24986. StrEnsureNoSuffixA(S, '\');
  24987. Assert(S = T, 'StrEnsureSuffix');
  24988. end;
  24989. { Split }
  24990. Assert(StrSplitAtCharA('ABC:X', AnsiChar(':'), S, T), 'StrSplitAtChar');
  24991. Assert(S = 'ABC', 'StrSplitAtChar');
  24992. Assert(T = 'X', 'StrSplitAtChar');
  24993. Assert(not StrSplitAtCharA('ABC:X', AnsiChar(','), S, T), 'StrSplitAtChar');
  24994. Assert(S = 'ABC:X', 'StrSplitAtChar');
  24995. Assert(T = '', 'StrSplitAtChar');
  24996. L := StrSplitA('', ',');
  24997. Assert(Length(L) = 0, 'StrSplit');
  24998. L := StrSplitA('ABC', ',');
  24999. Assert(Length(L) = 1, 'StrSplit');
  25000. Assert(L[0] = 'ABC', 'StrSplit');
  25001. L := StrSplitA('ABC', '');
  25002. Assert(Length(L) = 1, 'StrSplit');
  25003. Assert(L[0] = 'ABC', 'StrSplit');
  25004. L := StrSplitA('A,B,C', ',');
  25005. Assert(Length(L) = 3, 'StrSplit');
  25006. Assert(L[0] = 'A', 'StrSplit');
  25007. Assert(L[1] = 'B', 'StrSplit');
  25008. Assert(L[2] = 'C', 'StrSplit');
  25009. L := StrSplitA('1,23,456', ',');
  25010. Assert(Length(L) = 3, 'StrSplit');
  25011. Assert(L[0] = '1', 'StrSplit');
  25012. Assert(L[1] = '23', 'StrSplit');
  25013. Assert(L[2] = '456', 'StrSplit');
  25014. L := StrSplitA(',1,2,,3,', ',');
  25015. Assert(Length(L) = 6, 'StrSplit');
  25016. Assert(L[0] = '', 'StrSplit');
  25017. Assert(L[1] = '1', 'StrSplit');
  25018. Assert(L[2] = '2', 'StrSplit');
  25019. Assert(L[3] = '', 'StrSplit');
  25020. Assert(L[4] = '3', 'StrSplit');
  25021. Assert(L[5] = '', 'StrSplit');
  25022. L := StrSplitA('1..23..456', '..');
  25023. Assert(Length(L) = 3, 'StrSplit');
  25024. Assert(L[0] = '1', 'StrSplit');
  25025. Assert(L[1] = '23', 'StrSplit');
  25026. Assert(L[2] = '456', 'StrSplit');
  25027. { Count }
  25028. Assert(StrCountCharA('abcxyzdexxyxyz', AnsiChar('x')) = 4);
  25029. Assert(StrCountCharA('abcxyzdexxyxyz', AnsiChar('q')) = 0);
  25030. Assert(StrCountCharA('abcxyzdexxyxyz', ['a'..'z']) = 14);
  25031. Assert(StrCountCharW('abcxyzdexxyxyz', WideChar('x')) = 4);
  25032. Assert(StrCountCharW('abcxyzdexxyxyz', WideChar('q')) = 0);
  25033. Assert(StrCountCharW('abcxyzdexxyxyz', ['a'..'z']) = 14);
  25034. Assert(StrCountCharU('abcxyzdexxyxyz', WideChar('x')) = 4);
  25035. Assert(StrCountCharU('abcxyzdexxyxyz', WideChar('q')) = 0);
  25036. Assert(StrCountCharU('abcxyzdexxyxyz', ['a'..'z']) = 14);
  25037. Assert(StrCountChar('abcxyzdexxyxyz', Char('x')) = 4);
  25038. Assert(StrCountChar('abcxyzdexxyxyz', Char('q')) = 0);
  25039. Assert(StrCountChar('abcxyzdexxyxyz', ['a'..'z']) = 14);
  25040. { Quoting }
  25041. {$IFNDEF CLR}
  25042. Assert(StrRemoveSurroundingQuotesA('"123"') = '123', 'StrRemoveSurroundingQuotes');
  25043. Assert(StrRemoveSurroundingQuotesA('"1""23"') = '1""23', 'StrRemoveSurroundingQuotes');
  25044. Assert(StrQuoteA('Abe''s', '''') = '''Abe''''s''', 'StrQuote');
  25045. Assert(StrUnquoteA('"123"') = '123', 'StrUnQuote');
  25046. Assert(StrUnquoteA('"1""23"') = '1"23', 'StrUnQuote');
  25047. Assert(StrRemoveSurroundingQuotesW('"123"') = '123', 'StrRemoveSurroundingQuotes');
  25048. Assert(StrRemoveSurroundingQuotesW('"1""23"') = '1""23', 'StrRemoveSurroundingQuotes');
  25049. Assert(StrQuoteW('Abe''s', '''') = '''Abe''''s''', 'StrQuote');
  25050. Assert(StrUnquoteW('"123"') = '123', 'StrUnQuote');
  25051. Assert(StrUnquoteW('"1""23"') = '1"23', 'StrUnQuote');
  25052. Assert(StrRemoveSurroundingQuotesU('"123"') = '123', 'StrRemoveSurroundingQuotes');
  25053. Assert(StrRemoveSurroundingQuotesU('"1""23"') = '1""23', 'StrRemoveSurroundingQuotes');
  25054. Assert(StrQuoteU('Abe''s', '''') = '''Abe''''s''', 'StrQuote');
  25055. Assert(StrUnquoteU('"123"') = '123', 'StrUnQuote');
  25056. Assert(StrUnquoteU('"1""23"') = '1"23', 'StrUnQuote');
  25057. Assert(StrRemoveSurroundingQuotes('"123"') = '123', 'StrRemoveSurroundingQuotes');
  25058. Assert(StrRemoveSurroundingQuotes('"1""23"') = '1""23', 'StrRemoveSurroundingQuotes');
  25059. Assert(StrQuote('Abe''s', '''') = '''Abe''''s''', 'StrQuote');
  25060. Assert(StrUnquote('"123"') = '123', 'StrUnQuote');
  25061. Assert(StrUnquote('"1""23"') = '1"23', 'StrUnQuote');
  25062. Assert(StrIsQuotedStrA('"ABC""D"'), 'StrIsQuotedStr');
  25063. Assert(StrIsQuotedStrA('"A"'), 'StrIsQuotedStr');
  25064. Assert(not StrIsQuotedStrA('"ABC""D'''), 'StrIsQuotedStr');
  25065. Assert(not StrIsQuotedStrA('"ABC""D'), 'StrIsQuotedStr');
  25066. Assert(not StrIsQuotedStrA('"'), 'StrIsQuotedStr');
  25067. Assert(not StrIsQuotedStrA(''), 'StrIsQuotedStr');
  25068. Assert(StrIsQuotedStrA(''''''), 'StrIsQuotedStr');
  25069. Assert(not StrIsQuotedStrA('''a'''''), 'StrIsQuotedStr');
  25070. {$ENDIF}
  25071. { Delimited }
  25072. Assert(StrAfterA('ABCDEF', 'CD') = 'EF', 'StrAfter');
  25073. Assert(StrAfterA('ABCDEF', 'CE') = '', 'StrAfter');
  25074. Assert(StrAfterA('ABCDEF', 'CE', True) = 'ABCDEF', 'StrAfter');
  25075. Assert(StrAfterRevA('ABCABCABC', 'CA') = 'BC', 'StrAfterRev');
  25076. Assert(StrAfterRevA('ABCABCABC', 'CD') = '', 'StrAfterRev');
  25077. Assert(StrAfterRevA('ABCABCABC', 'CD', True) = 'ABCABCABC', 'StrAfterRev');
  25078. Assert(StrBetweenCharA('ABC', AnsiChar('<'), AnsiChar('>')) = '', 'StrBetweenChar');
  25079. Assert(StrBetweenCharA('ABC<D>', AnsiChar('<'), AnsiChar('>')) = 'D', 'StrBetweenChar');
  25080. Assert(StrBetweenCharA('A*BC*D', AnsiChar('*'), AnsiChar('*')) = 'BC', 'StrBetweenChar');
  25081. Assert(StrBetweenCharA('(ABC)', AnsiChar('('), AnsiChar(')')) = 'ABC', 'StrBetweenChar');
  25082. Assert(StrBetweenCharA('XYZ(ABC)(DEF)', AnsiChar('('), AnsiChar(')')) = 'ABC', 'StrBetweenChar');
  25083. Assert(StrBetweenCharA('XYZ"ABC', AnsiChar('"'), AnsiChar('"')) = '', 'StrBetweenChar');
  25084. Assert(StrBetweenCharA('1234543210', AnsiChar('3'), AnsiChar('3'), False, False) = '454', 'StrBetweenChar');
  25085. Assert(StrBetweenCharA('1234543210', AnsiChar('3'), AnsiChar('4'), False, False) = '', 'StrBetweenChar');
  25086. Assert(StrBetweenCharA('1234543210', AnsiChar('4'), AnsiChar('3'), False, False) = '54', 'StrBetweenChar');
  25087. Assert(StrBetweenCharA('1234543210', AnsiChar('4'), AnsiChar('6'), False, False) = '', 'StrBetweenChar');
  25088. Assert(StrBetweenCharA('1234543210', AnsiChar('4'), AnsiChar('6'), False, True) = '543210', 'StrBetweenChar');
  25089. Assert(StrBetweenCharW('ABC', WideChar('<'), WideChar('>')) = '', 'StrBetweenChar');
  25090. Assert(StrBetweenCharW('ABC<D>', WideChar('<'), WideChar('>')) = 'D', 'StrBetweenChar');
  25091. Assert(StrBetweenChar('ABC', Char('<'), Char('>')) = '', 'StrBetweenChar');
  25092. Assert(StrBetweenChar('ABC<D>', Char('<'), Char('>')) = 'D', 'StrBetweenChar');
  25093. Assert(StrBetweenA('XYZ(ABC)(DEF)', '(', [')']) = 'ABC', 'StrBetween');
  25094. Assert(StrBetweenA('XYZ(ABC)(DEF)', 'Z(', [')']) = 'ABC', 'StrBetween');
  25095. S := 'XYZ(ABC)<DEF>G"H"IJ"KLM"<N';
  25096. Assert(StrRemoveCharDelimitedA(S, '<', '>') = 'DEF', 'StrRemoveCharDelimited');
  25097. Assert(S = 'XYZ(ABC)G"H"IJ"KLM"<N', 'StrRemoveCharDelimited');
  25098. Assert(StrRemoveCharDelimitedA(S, '<', '>') = '', 'StrRemoveCharDelimited');
  25099. Assert(S = 'XYZ(ABC)G"H"IJ"KLM"<N', 'StrRemoveCharDelimited');
  25100. Assert(StrRemoveCharDelimitedA(S, '(', ')') = 'ABC', 'StrRemoveCharDelimited');
  25101. Assert(S = 'XYZG"H"IJ"KLM"<N', 'StrRemoveCharDelimited');
  25102. Assert(StrRemoveCharDelimitedA(S, '"', '"') = 'H', 'StrRemoveCharDelimited');
  25103. Assert(S = 'XYZGIJ"KLM"<N', 'StrRemoveCharDelimited');
  25104. Assert(StrRemoveCharDelimitedA(S, '"', '"') = 'KLM', 'StrRemoveCharDelimited');
  25105. Assert(S = 'XYZGIJ<N', 'StrRemoveCharDelimited');
  25106. { Replace }
  25107. Assert(StrReplaceCharA(AnsiChar('X'), AnsiChar('A'), '') = '', 'StrReplaceChar');
  25108. Assert(StrReplaceCharA(AnsiChar('X'), AnsiChar('A'), 'XXX') = 'AAA', 'StrReplaceChar');
  25109. Assert(StrReplaceCharA(AnsiChar('X'), AnsiChar('A'), 'X') = 'A', 'StrReplaceChar');
  25110. Assert(StrReplaceCharA(AnsiChar('X'), AnsiChar('!'), 'ABCXXBXAC') = 'ABC!!B!AC', 'StrReplaceChar');
  25111. Assert(StrReplaceCharA(['A', 'B'], AnsiChar('C'), 'ABCDABCD') = 'CCCDCCCD', 'StrReplaceChar');
  25112. Assert(StrReplaceA('', 'A', 'ABCDEF') = 'ABCDEF', 'StrReplace');
  25113. Assert(StrReplaceA('B', 'A', 'ABCDEFEDCBA') = 'AACDEFEDCAA', 'StrReplace');
  25114. Assert(StrReplaceA('BC', '', 'ABCDEFEDCBA') = 'ADEFEDCBA', 'StrReplace');
  25115. Assert(StrReplaceA('A', '', 'ABAABAA') = 'BB', 'StrReplace');
  25116. Assert(StrReplaceA('C', 'D', 'ABAABAA') = 'ABAABAA', 'StrReplace');
  25117. Assert(StrReplaceA('B', 'CC', 'ABAABAA') = 'ACCAACCAA', 'StrReplace');
  25118. Assert(StrReplaceA('a', 'b', 'bababa') = 'bbbbbb', 'StrReplace');
  25119. Assert(StrReplaceA('a', '', 'bababa') = 'bbb', 'StrReplace');
  25120. Assert(StrReplaceA('a', '', 'aaa') = '', 'StrReplace');
  25121. Assert(StrReplaceA('aba', 'x', 'bababa') = 'bxba', 'StrReplace');
  25122. Assert(StrReplaceA('b', 'bb', 'bababa') = 'bbabbabba', 'StrReplace');
  25123. Assert(StrReplaceA('c', 'aa', 'bababa') = 'bababa', 'StrReplace');
  25124. Assert(StrReplaceA('ba', '', 'bababa') = '', 'StrReplace');
  25125. Assert(StrReplaceA('BA', '', 'bababa', False) = '', 'StrReplace');
  25126. Assert(StrReplaceA('BA', 'X', 'bababa', False) = 'XXX', 'StrReplace');
  25127. Assert(StrReplaceA('aa', '12', 'aaaaa') = '1212a', 'StrReplace');
  25128. Assert(StrReplaceA('aa', 'a', 'aaaaa') = 'aaa', 'StrReplace');
  25129. {$IFNDEF CLR}
  25130. Assert(StrReplaceA(['b'], 'z', 'bababa') = 'zazaza', 'StrReplace');
  25131. Assert(StrReplaceA(['b', 'a'], 'z', 'bababa') = 'zzzzzz', 'StrReplace');
  25132. {$ENDIF}
  25133. Assert(StrReplaceA('a', 'b', 'bababa') = 'bbbbbb', 'StrReplace');
  25134. Assert(StrReplaceA('a', '', 'bababa') = 'bbb', 'StrReplace');
  25135. Assert(StrReplaceA('a', '', 'aaa') = '', 'StrReplace');
  25136. S := DupStrA('ABCDEFGH', 100000);
  25137. S := StrReplaceA('BC', 'X', S);
  25138. Assert(S = DupStrA('AXDEFGH', 100000), 'StrReplace');
  25139. Assert(StrRemoveDupA('BBBAABABBA', 'B') = 'BAABABA', 'StrRemoveDup');
  25140. Assert(StrRemoveDupA('azaazzel', 'a') = 'azazzel', 'StrRemoveDup');
  25141. Assert(StrRemoveDupA('BBBAABABBA', 'A') = 'BBBABABBA', 'StrRemoveDup');
  25142. {$IFNDEF CLR}
  25143. Assert(StrRemoveCharSetA('BBBAABABBA', ['B']) = 'AAAA', 'StrRemoveChar');
  25144. {$ENDIF}
  25145. Assert(StrReplaceCharW(WideChar('X'), WideChar('A'), '') = '', 'StrReplaceChar');
  25146. Assert(StrReplaceCharW(WideChar('X'), WideChar('A'), 'XXX') = 'AAA', 'StrReplaceChar');
  25147. Assert(StrReplaceCharW(WideChar('X'), WideChar('A'), 'X') = 'A', 'StrReplaceChar');
  25148. Assert(StrReplaceCharW(WideChar('X'), WideChar('!'), 'ABCXXBXAC') = 'ABC!!B!AC', 'StrReplaceChar');
  25149. Assert(StrReplaceCharW(['A', 'B'], WideChar('C'), 'ABCDABCD') = 'CCCDCCCD', 'StrReplaceChar');
  25150. Assert(StrReplaceW('', 'A', 'ABCDEF') = 'ABCDEF', 'StrReplace');
  25151. Assert(StrReplaceW('B', 'A', 'ABCDEFEDCBA') = 'AACDEFEDCAA', 'StrReplace');
  25152. Assert(StrReplaceW('BC', '', 'ABCDEFEDCBA') = 'ADEFEDCBA', 'StrReplace');
  25153. Assert(StrReplaceW('A', '', 'ABAABAA') = 'BB', 'StrReplace');
  25154. Assert(StrReplaceW('C', 'D', 'ABAABAA') = 'ABAABAA', 'StrReplace');
  25155. Assert(StrReplaceW('B', 'CC', 'ABAABAA') = 'ACCAACCAA', 'StrReplace');
  25156. Assert(StrReplaceW('a', 'b', 'bababa') = 'bbbbbb', 'StrReplace');
  25157. Assert(StrReplaceW('a', '', 'bababa') = 'bbb', 'StrReplace');
  25158. Assert(StrReplaceW('a', '', 'aaa') = '', 'StrReplace');
  25159. Assert(StrReplaceW('aba', 'x', 'bababa') = 'bxba', 'StrReplace');
  25160. Assert(StrReplaceW('b', 'bb', 'bababa') = 'bbabbabba', 'StrReplace');
  25161. Assert(StrReplaceW('c', 'aa', 'bababa') = 'bababa', 'StrReplace');
  25162. Assert(StrReplaceW('ba', '', 'bababa') = '', 'StrReplace');
  25163. Assert(StrReplaceW('BA', '', 'bababa', False) = '', 'StrReplace');
  25164. Assert(StrReplaceW('BA', 'X', 'bababa', False) = 'XXX', 'StrReplace');
  25165. Assert(StrReplaceW('aa', '12', 'aaaaa') = '1212a', 'StrReplace');
  25166. Assert(StrReplaceW('aa', 'a', 'aaaaa') = 'aaa', 'StrReplace');
  25167. {$IFNDEF CLR}
  25168. Assert(StrReplaceW(['b'], 'z', 'bababa') = 'zazaza', 'StrReplace');
  25169. Assert(StrReplaceW(['b', 'a'], 'z', 'bababa') = 'zzzzzz', 'StrReplace');
  25170. {$ENDIF}
  25171. Assert(StrReplaceW('a', 'b', 'bababa') = 'bbbbbb', 'StrReplace');
  25172. Assert(StrReplaceW('a', '', 'bababa') = 'bbb', 'StrReplace');
  25173. Assert(StrReplaceW('a', '', 'aaa') = '', 'StrReplace');
  25174. W := DupStrW('ABCDEFGH', 100000);
  25175. X := StrReplaceW('BC', 'X', W);
  25176. Assert(X = DupStrW('AXDEFGH', 100000), 'StrReplace');
  25177. Assert(StrRemoveDupW('BBBAABABBA', 'B') = 'BAABABA', 'StrRemoveDup');
  25178. Assert(StrRemoveDupW('azaazzel', 'a') = 'azazzel', 'StrRemoveDup');
  25179. Assert(StrRemoveDupW('BBBAABABBA', 'A') = 'BBBABABBA', 'StrRemoveDup');
  25180. {$IFNDEF CLR}
  25181. Assert(StrRemoveCharSetW('BBBAABABBA', ['B']) = 'AAAA', 'StrRemoveChar');
  25182. {$ENDIF}
  25183. Assert(StrReplaceCharU(WideChar('X'), WideChar('A'), '') = '', 'StrReplaceChar');
  25184. Assert(StrReplaceCharU(WideChar('X'), WideChar('A'), 'XXX') = 'AAA', 'StrReplaceChar');
  25185. Assert(StrReplaceCharU(WideChar('X'), WideChar('A'), 'X') = 'A', 'StrReplaceChar');
  25186. Assert(StrReplaceCharU(WideChar('X'), WideChar('!'), 'ABCXXBXAC') = 'ABC!!B!AC', 'StrReplaceChar');
  25187. Assert(StrReplaceCharU(['A', 'B'], WideChar('C'), 'ABCDABCD') = 'CCCDCCCD', 'StrReplaceChar');
  25188. Assert(StrReplaceU('', 'A', 'ABCDEF') = 'ABCDEF', 'StrReplace');
  25189. Assert(StrReplaceU('B', 'A', 'ABCDEFEDCBA') = 'AACDEFEDCAA', 'StrReplace');
  25190. Assert(StrReplaceU('BC', '', 'ABCDEFEDCBA') = 'ADEFEDCBA', 'StrReplace');
  25191. Assert(StrReplaceU('A', '', 'ABAABAA') = 'BB', 'StrReplace');
  25192. Assert(StrReplaceU('C', 'D', 'ABAABAA') = 'ABAABAA', 'StrReplace');
  25193. Assert(StrReplaceU('B', 'CC', 'ABAABAA') = 'ACCAACCAA', 'StrReplace');
  25194. Assert(StrReplaceU('a', 'b', 'bababa') = 'bbbbbb', 'StrReplace');
  25195. Assert(StrReplaceU('a', '', 'bababa') = 'bbb', 'StrReplace');
  25196. Assert(StrReplaceU('a', '', 'aaa') = '', 'StrReplace');
  25197. Assert(StrReplaceU('aba', 'x', 'bababa') = 'bxba', 'StrReplace');
  25198. Assert(StrReplaceU('b', 'bb', 'bababa') = 'bbabbabba', 'StrReplace');
  25199. Assert(StrReplaceU('c', 'aa', 'bababa') = 'bababa', 'StrReplace');
  25200. Assert(StrReplaceU('ba', '', 'bababa') = '', 'StrReplace');
  25201. Assert(StrReplaceU('BA', '', 'bababa', False) = '', 'StrReplace');
  25202. Assert(StrReplaceU('BA', 'X', 'bababa', False) = 'XXX', 'StrReplace');
  25203. Assert(StrReplaceU('aa', '12', 'aaaaa') = '1212a', 'StrReplace');
  25204. Assert(StrReplaceU('aa', 'a', 'aaaaa') = 'aaa', 'StrReplace');
  25205. {$IFNDEF CLR}
  25206. Assert(StrReplaceU(['b'], 'z', 'bababa') = 'zazaza', 'StrReplace');
  25207. Assert(StrReplaceU(['b', 'a'], 'z', 'bababa') = 'zzzzzz', 'StrReplace');
  25208. {$ENDIF}
  25209. Assert(StrReplaceU('a', 'b', 'bababa') = 'bbbbbb', 'StrReplace');
  25210. Assert(StrReplaceU('a', '', 'bababa') = 'bbb', 'StrReplace');
  25211. Assert(StrReplaceU('a', '', 'aaa') = '', 'StrReplace');
  25212. W := DupStrU('ABCDEFGH', 100000);
  25213. X := StrReplaceU('BC', 'X', W);
  25214. Assert(X = DupStrU('AXDEFGH', 100000), 'StrReplace');
  25215. Assert(StrRemoveDupU('BBBAABABBA', 'B') = 'BAABABA', 'StrRemoveDup');
  25216. Assert(StrRemoveDupU('azaazzel', 'a') = 'azazzel', 'StrRemoveDup');
  25217. Assert(StrRemoveDupU('BBBAABABBA', 'A') = 'BBBABABBA', 'StrRemoveDup');
  25218. {$IFNDEF CLR}
  25219. Assert(StrRemoveCharSetU('BBBAABABBA', ['B']) = 'AAAA', 'StrRemoveChar');
  25220. {$ENDIF}
  25221. Assert(StrReplaceChar(Char('X'), Char('A'), '') = '', 'StrReplaceChar');
  25222. Assert(StrReplaceChar(Char('X'), Char('A'), 'XXX') = 'AAA', 'StrReplaceChar');
  25223. Assert(StrReplaceChar(Char('X'), Char('A'), 'X') = 'A', 'StrReplaceChar');
  25224. Assert(StrReplaceChar(Char('X'), Char('!'), 'ABCXXBXAC') = 'ABC!!B!AC', 'StrReplaceChar');
  25225. Assert(StrReplaceChar(['A', 'B'], Char('C'), 'ABCDABCD') = 'CCCDCCCD', 'StrReplaceChar');
  25226. Assert(StrReplace('', 'A', 'ABCDEF') = 'ABCDEF', 'StrReplace');
  25227. Assert(StrReplace('B', 'A', 'ABCDEFEDCBA') = 'AACDEFEDCAA', 'StrReplace');
  25228. Assert(StrReplace('BC', '', 'ABCDEFEDCBA') = 'ADEFEDCBA', 'StrReplace');
  25229. Assert(StrReplace('A', '', 'ABAABAA') = 'BB', 'StrReplace');
  25230. Assert(StrReplace('C', 'D', 'ABAABAA') = 'ABAABAA', 'StrReplace');
  25231. Assert(StrReplace('B', 'CC', 'ABAABAA') = 'ACCAACCAA', 'StrReplace');
  25232. Assert(StrReplace('a', 'b', 'bababa') = 'bbbbbb', 'StrReplace');
  25233. Assert(StrReplace('a', '', 'bababa') = 'bbb', 'StrReplace');
  25234. Assert(StrReplace('a', '', 'aaa') = '', 'StrReplace');
  25235. Assert(StrReplace('aba', 'x', 'bababa') = 'bxba', 'StrReplace');
  25236. Assert(StrReplace('b', 'bb', 'bababa') = 'bbabbabba', 'StrReplace');
  25237. Assert(StrReplace('c', 'aa', 'bababa') = 'bababa', 'StrReplace');
  25238. Assert(StrReplace('ba', '', 'bababa') = '', 'StrReplace');
  25239. Assert(StrReplace('BA', '', 'bababa', False) = '', 'StrReplace');
  25240. Assert(StrReplace('BA', 'X', 'bababa', False) = 'XXX', 'StrReplace');
  25241. Assert(StrReplace('aa', '12', 'aaaaa') = '1212a', 'StrReplace');
  25242. Assert(StrReplace('aa', 'a', 'aaaaa') = 'aaa', 'StrReplace');
  25243. {$IFNDEF CLR}
  25244. Assert(StrReplace(['b'], 'z', 'bababa') = 'zazaza', 'StrReplace');
  25245. Assert(StrReplace(['b', 'a'], 'z', 'bababa') = 'zzzzzz', 'StrReplace');
  25246. {$ENDIF}
  25247. Assert(StrReplace('a', 'b', 'bababa') = 'bbbbbb', 'StrReplace');
  25248. Assert(StrReplace('a', '', 'bababa') = 'bbb', 'StrReplace');
  25249. Assert(StrReplace('a', '', 'aaa') = '', 'StrReplace');
  25250. Y := DupStr('ABCDEFGH', 100000);
  25251. Z := StrReplace('BC', 'X', Y);
  25252. Assert(Z = DupStr('AXDEFGH', 100000), 'StrReplace');
  25253. Assert(StrRemoveDup('BBBAABABBA', 'B') = 'BAABABA', 'StrRemoveDup');
  25254. Assert(StrRemoveDup('azaazzel', 'a') = 'azazzel', 'StrRemoveDup');
  25255. Assert(StrRemoveDup('BBBAABABBA', 'A') = 'BBBABABBA', 'StrRemoveDup');
  25256. {$IFNDEF CLR}
  25257. Assert(StrRemoveCharSet('BBBAABABBA', ['B']) = 'AAAA', 'StrRemoveChar');
  25258. {$ENDIF}
  25259. Assert(StrReplaceCharStrA('A', '', 'AXAYAA') = 'XY');
  25260. Assert(StrReplaceCharStrA('A', 'B', 'AXAYAA') = 'BXBYBB');
  25261. Assert(StrReplaceCharStrA('A', 'CC', 'AXAYAA') = 'CCXCCYCCCC');
  25262. Assert(StrReplaceCharStrA('A', 'AIJK', 'AXAYAA') = 'AIJKXAIJKYAIJKAIJK');
  25263. { MatchQuantSeq }
  25264. {$IFNDEF CLR}
  25265. Assert(MatchQuantSeq(I, [csAlpha], [mqOnce], 'a', []));
  25266. Assert(I = 1);
  25267. Assert(MatchQuantSeq(I, [csAlpha], [mqAny], 'a', []));
  25268. Assert(I = 1);
  25269. Assert(MatchQuantSeq(I, [csAlpha], [mqLeastOnce], 'a', []));
  25270. Assert(I = 1);
  25271. Assert(MatchQuantSeq(I, [csAlpha], [mqOptional], 'a', []));
  25272. Assert(I = 1);
  25273. Assert(MatchQuantSeq(I, [csAlpha], [mqOnce], 'ab', []));
  25274. Assert(I = 1);
  25275. Assert(MatchQuantSeq(I, [csAlpha], [mqAny], 'ab', []));
  25276. Assert(I = 2);
  25277. Assert(MatchQuantSeq(I, [csAlpha], [mqLeastOnce], 'ab', []));
  25278. Assert(I = 2);
  25279. Assert(MatchQuantSeq(I, [csAlpha], [mqOptional], 'ab', []));
  25280. Assert(I = 1);
  25281. Assert(MatchQuantSeq(I, [csAlpha], [mqOnce], 'abc', []));
  25282. Assert(I = 1);
  25283. Assert(MatchQuantSeq(I, [csAlpha], [mqAny], 'abc', []));
  25284. Assert(I = 3);
  25285. Assert(MatchQuantSeq(I, [csAlpha], [mqLeastOnce], 'abc', []));
  25286. Assert(I = 3);
  25287. Assert(MatchQuantSeq(I, [csAlpha], [mqOptional], 'abc', []));
  25288. Assert(I = 1);
  25289. Assert(not MatchQuantSeq(I, [csAlpha, csNumeric], [mqOnce, mqOnce], 'ab12', []));
  25290. Assert(I = 0);
  25291. Assert(MatchQuantSeq(I, [csAlpha, csNumeric], [mqAny, mqOnce], 'abc123', []));
  25292. Assert(I = 4);
  25293. Assert(not MatchQuantSeq(I, [csAlpha, csNumeric], [mqLeastOnce, mqAny], '123', []));
  25294. Assert(I = 0);
  25295. Assert(MatchQuantSeq(I, [csAlpha, csNumeric], [mqOptional, mqAny], '123abc', []));
  25296. Assert(I = 3);
  25297. Assert(MatchQuantSeq(I, [csAlpha, csNumeric], [mqOnce, mqAny], 'a123', []));
  25298. Assert(I = 4);
  25299. Assert(MatchQuantSeq(I, [csAlpha, csNumeric], [mqAny, mqAny], 'abc123', []));
  25300. Assert(I = 6);
  25301. Assert(MatchQuantSeq(I, [csAlpha, csNumeric], [mqLeastOnce, mqOnce], 'ab123', []));
  25302. Assert(I = 3);
  25303. Assert(MatchQuantSeq(I, [csAlpha, csNumeric], [mqOptional, mqOptional], '1', []));
  25304. Assert(I = 1);
  25305. Assert(MatchQuantSeq(I, [csAlpha, csNumeric], [mqOptional, mqOptional], 'a', []));
  25306. Assert(I = 1);
  25307. Assert(MatchQuantSeq(I, [csAlpha, csNumeric], [mqOnce, mqOptional], 'ab', []));
  25308. Assert(I = 1);
  25309. Assert(not MatchQuantSeq(I, [csAlpha, csNumeric], [mqOptional, mqOnce], 'ab', []));
  25310. Assert(I = 0);
  25311. Assert(MatchQuantSeq(I, [csAlphaNumeric, csNumeric, csAlpha, csNumeric],
  25312. [mqLeastOnce, mqAny, mqOptional, mqOnce], 'a1b2', []));
  25313. Assert(I = 4);
  25314. Assert(MatchQuantSeq(I, [csAlphaNumeric, csNumeric, csAlpha, csNumeric],
  25315. [mqAny, mqOnce, mqOptional, mqOnce], 'a1b2cd3efg4', []));
  25316. Assert(I = 4);
  25317. Assert(MatchQuantSeq(I, [csAlphaNumeric, csNumeric], [mqAny, mqOptional], 'a1', [moDeterministic]));
  25318. Assert(I = 2);
  25319. Assert(not MatchQuantSeq(I, [csAlphaNumeric, csNumeric], [mqAny, mqOnce], 'a1', [moDeterministic]));
  25320. Assert(I = 0);
  25321. Assert(MatchQuantSeq(I, [csAlpha, csNumeric, csAlpha, csAlphaNumeric],
  25322. [mqAny, mqOnce, mqAny, mqLeastOnce], 'a1b2cd3efg4', [moDeterministic]));
  25323. Assert(I = 11);
  25324. Assert(MatchQuantSeq(I, [csAlphaNumeric, csNumeric], [mqAny, mqOptional], 'a1', [moNonGreedy]));
  25325. Assert(I = 0);
  25326. Assert(MatchQuantSeq(I, [csAlphaNumeric, csNumeric], [mqAny, mqLeastOnce], 'a1', [moNonGreedy]));
  25327. Assert(I = 2);
  25328. Assert(not MatchQuantSeq(I, [csAlphaNumeric, csNumeric], [mqAny, mqOnce], 'abc', [moNonGreedy]));
  25329. Assert(I = 0);
  25330. Assert(MatchQuantSeq(I, [csAlphaNumeric, csNumeric, csAlpha, csNumeric],
  25331. [mqAny, mqOnce, mqOnce, mqLeastOnce], 'a1bc2de3g4', [moNonGreedy]));
  25332. Assert(I = 10);
  25333. {$ENDIF}
  25334. { MatchPattern }
  25335. {$IFNDEF ManagedCode}
  25336. Assert(StrZMatchPatternA('', '', mpgLazy) = 0);
  25337. Assert(StrZMatchPatternA('', '', mpgGreedy) = 0);
  25338. Assert(StrZMatchPatternA('', '', mpgGreedyNoBacktrack) = 0);
  25339. Assert(StrZMatchPatternA('', 'a', mpgLazy) = 0);
  25340. Assert(StrZMatchPatternW('', '', mpgLazy) = 0);
  25341. Assert(StrZMatchPatternA('a', '', mpgLazy) < 0);
  25342. Assert(StrZMatchPatternA('a', 'a', mpgLazy) = 1);
  25343. Assert(StrZMatchPatternA('a', 'b', mpgLazy) < 0);
  25344. Assert(StrZMatchPatternA('a', 'aa', mpgLazy) = 1);
  25345. Assert(StrZMatchPatternA('aa', '', mpgLazy) < 0);
  25346. Assert(StrZMatchPatternA('aa', 'a', mpgLazy) < 0);
  25347. Assert(StrZMatchPatternA('aa', 'aa', mpgLazy) = 2);
  25348. Assert(StrZMatchPatternA('aa', 'aaa', mpgLazy) = 2);
  25349. Assert(StrZMatchPatternA('aa', 'ab', mpgLazy) < 0);
  25350. Assert(StrZMatchPatternA('.', '', mpgLazy) < 0);
  25351. Assert(StrZMatchPatternA('.', 'a', mpgLazy) = 1);
  25352. Assert(StrZMatchPatternA('.', 'aa', mpgLazy) = 1);
  25353. Assert(StrZMatchPatternA('a.', 'a', mpgLazy) < 0);
  25354. Assert(StrZMatchPatternA('a.', 'aa', mpgLazy) = 2);
  25355. Assert(StrZMatchPatternA('a.', 'aaa', mpgLazy) = 2);
  25356. Assert(StrZMatchPatternA('.a', 'a', mpgLazy) < 0);
  25357. Assert(StrZMatchPatternA('.a', 'aa', mpgLazy) = 2);
  25358. Assert(StrZMatchPatternA('.a', 'ab', mpgLazy) < 0);
  25359. Assert(StrZMatchPatternA('?', '', mpgLazy) = 0);
  25360. Assert(StrZMatchPatternA('?', 'a', mpgLazy) = 0);
  25361. Assert(StrZMatchPatternA('?', 'aa', mpgLazy) = 0);
  25362. Assert(StrZMatchPatternA('a?', 'a', mpgLazy) = 1);
  25363. Assert(StrZMatchPatternA('a?', 'aa', mpgLazy) = 1);
  25364. Assert(StrZMatchPatternA('a?', 'aaa', mpgLazy) = 1);
  25365. Assert(StrZMatchPatternA('?a', 'a', mpgLazy) = 1);
  25366. Assert(StrZMatchPatternA('?a', 'aa', mpgLazy) = 1);
  25367. Assert(StrZMatchPatternA('?a', 'ab', mpgLazy) = 1);
  25368. Assert(StrZMatchPatternA('?', '', mpgGreedy) = 0);
  25369. Assert(StrZMatchPatternA('?', 'a', mpgGreedy) = 1);
  25370. Assert(StrZMatchPatternA('?', 'aa', mpgGreedy) = 1);
  25371. Assert(StrZMatchPatternA('a?', 'a', mpgGreedy) = 1);
  25372. Assert(StrZMatchPatternA('a?', 'aa', mpgGreedy) = 2);
  25373. Assert(StrZMatchPatternA('a?', 'aaa', mpgGreedy) = 2);
  25374. Assert(StrZMatchPatternA('?a', 'a', mpgGreedy) = 1);
  25375. Assert(StrZMatchPatternA('?a', 'aa', mpgGreedy) = 2);
  25376. Assert(StrZMatchPatternA('?a', 'ab', mpgGreedy) = 1);
  25377. Assert(StrZMatchPatternA('?', '', mpgGreedyNoBacktrack) = 0);
  25378. Assert(StrZMatchPatternA('?', 'a', mpgGreedyNoBacktrack) = 1);
  25379. Assert(StrZMatchPatternA('?', 'aa', mpgGreedyNoBacktrack) = 1);
  25380. Assert(StrZMatchPatternA('a?', 'a', mpgGreedyNoBacktrack) = 1);
  25381. Assert(StrZMatchPatternA('a?', 'aa', mpgGreedyNoBacktrack) = 2);
  25382. Assert(StrZMatchPatternA('a?', 'aaa', mpgGreedyNoBacktrack) = 2);
  25383. Assert(StrZMatchPatternA('?a', 'a', mpgGreedyNoBacktrack) < 0);
  25384. Assert(StrZMatchPatternA('?a', 'aa', mpgGreedyNoBacktrack) = 2);
  25385. Assert(StrZMatchPatternA('?a', 'ab', mpgGreedyNoBacktrack) < 0);
  25386. Assert(StrZMatchPatternA('*', '', mpgLazy) = 0);
  25387. Assert(StrZMatchPatternA('*', 'a', mpgLazy) = 0);
  25388. Assert(StrZMatchPatternA('*', 'aa', mpgLazy) = 0);
  25389. Assert(StrZMatchPatternA('a*', '', mpgLazy) < 0);
  25390. Assert(StrZMatchPatternA('a*', 'a', mpgLazy) = 1);
  25391. Assert(StrZMatchPatternA('a*', 'aa', mpgLazy) = 1);
  25392. Assert(StrZMatchPatternA('a*', 'abc', mpgLazy) = 1);
  25393. Assert(StrZMatchPatternA('a*b', 'a', mpgLazy) < 0);
  25394. Assert(StrZMatchPatternA('a*b', 'ab', mpgLazy) = 2);
  25395. Assert(StrZMatchPatternA('a*b', 'acb', mpgLazy) = 3);
  25396. Assert(StrZMatchPatternA('a*b', 'acbd', mpgLazy) = 3);
  25397. Assert(StrZMatchPatternA('a*b', 'acccbd', mpgLazy) = 5);
  25398. Assert(StrZMatchPatternA('a*b', 'acbcb', mpgLazy) = 3);
  25399. Assert(StrZMatchPatternA('a*b', 'acbcbd', mpgLazy) = 3);
  25400. Assert(StrZMatchPatternA('a*b', 'bb', mpgLazy) < 0);
  25401. Assert(StrZMatchPatternA('*', '', mpgGreedy) = 0);
  25402. Assert(StrZMatchPatternA('*', 'a', mpgGreedy) = 1);
  25403. Assert(StrZMatchPatternA('*', 'aa', mpgGreedy) = 2);
  25404. Assert(StrZMatchPatternA('a*', '', mpgGreedy) < 0);
  25405. Assert(StrZMatchPatternA('a*', 'a', mpgGreedy) = 1);
  25406. Assert(StrZMatchPatternA('a*', 'aa', mpgGreedy) = 2);
  25407. Assert(StrZMatchPatternA('a*', 'abc', mpgGreedy) = 3);
  25408. Assert(StrZMatchPatternA('a*b', 'a', mpgGreedy) < 0);
  25409. Assert(StrZMatchPatternA('a*b', 'ab', mpgGreedy) = 2);
  25410. Assert(StrZMatchPatternA('a*b', 'acb', mpgGreedy) = 3);
  25411. Assert(StrZMatchPatternA('a*b', 'acbd', mpgGreedy) = 3);
  25412. Assert(StrZMatchPatternA('a*b', 'acccbd', mpgGreedy) = 5);
  25413. Assert(StrZMatchPatternA('a*b', 'acbcb', mpgGreedy) = 5);
  25414. Assert(StrZMatchPatternA('a*b', 'acbcbd', mpgGreedy) = 5);
  25415. Assert(StrZMatchPatternA('a*b', 'bb', mpgGreedy) < 0);
  25416. Assert(StrZMatchPatternA('*', '', mpgGreedyNoBacktrack) = 0);
  25417. Assert(StrZMatchPatternA('*', 'a', mpgGreedyNoBacktrack) = 1);
  25418. Assert(StrZMatchPatternA('*', 'aa', mpgGreedyNoBacktrack) = 2);
  25419. Assert(StrZMatchPatternA('a*', '', mpgGreedyNoBacktrack) < 0);
  25420. Assert(StrZMatchPatternA('a*', 'a', mpgGreedyNoBacktrack) = 1);
  25421. Assert(StrZMatchPatternA('a*', 'aa', mpgGreedyNoBacktrack) = 2);
  25422. Assert(StrZMatchPatternA('a*', 'abc', mpgGreedyNoBacktrack) = 3);
  25423. Assert(StrZMatchPatternA('a*b', 'a', mpgGreedyNoBacktrack) < 0);
  25424. Assert(StrZMatchPatternA('a*b', 'ab', mpgGreedyNoBacktrack) < 0);
  25425. Assert(StrZMatchPatternA('a*b', 'acb', mpgGreedyNoBacktrack) < 0);
  25426. Assert(StrZMatchPatternA('a*b', 'acbd', mpgGreedyNoBacktrack) < 0);
  25427. Assert(StrZMatchPatternA('a*b', 'acccbd', mpgGreedyNoBacktrack) < 0);
  25428. Assert(StrZMatchPatternA('a*b', 'acbcb', mpgGreedyNoBacktrack) < 0);
  25429. Assert(StrZMatchPatternA('a*b', 'acbcbd', mpgGreedyNoBacktrack) < 0);
  25430. Assert(StrZMatchPatternA('a*b', 'bb', mpgGreedyNoBacktrack) < 0);
  25431. Assert(StrZMatchPatternA('a[b]', 'a', mpgLazy) < 0);
  25432. Assert(StrZMatchPatternA('a[b]', 'ab', mpgLazy) = 2);
  25433. Assert(StrZMatchPatternA('a[b]', 'abb', mpgLazy) = 2);
  25434. Assert(StrZMatchPatternA('a[b]', 'aa', mpgLazy) < 0);
  25435. Assert(StrZMatchPatternA('a[^a]', 'a', mpgLazy) < 0);
  25436. Assert(StrZMatchPatternA('a[^a]', 'ab', mpgLazy) = 2);
  25437. Assert(StrZMatchPatternA('a[^a]', 'abb', mpgLazy) = 2);
  25438. Assert(StrZMatchPatternA('a[^a]', 'aa', mpgLazy) < 0);
  25439. Assert(StrZMatchPatternA('a[0-9]', 'a', mpgLazy) < 0);
  25440. Assert(StrZMatchPatternA('a[0-9]', 'a0', mpgLazy) = 2);
  25441. Assert(StrZMatchPatternA('a[0-9]', 'aa', mpgLazy) < 0);
  25442. Assert(StrZMatchPatternA('a[0-9]', 'a99', mpgLazy) = 2);
  25443. Assert(StrZMatchPatternA('a[^0-9]', 'a', mpgLazy) < 0);
  25444. Assert(StrZMatchPatternA('a[^0-9]', 'a0', mpgLazy) < 0);
  25445. Assert(StrZMatchPatternA('a[^0-9]', 'aa', mpgLazy) = 2);
  25446. Assert(StrZMatchPatternA('a[^0-9]', 'aaa', mpgLazy) = 2);
  25447. Assert(StrZMatchPatternA('a[0-9a-z]', 'a', mpgLazy) < 0);
  25448. Assert(StrZMatchPatternA('a[0-9a-z]', 'aa', mpgLazy) = 2);
  25449. Assert(StrZMatchPatternA('a[0-9a-z]', 'az', mpgLazy) = 2);
  25450. Assert(StrZMatchPatternA('a[0-9a-z]', 'a0', mpgLazy) = 2);
  25451. Assert(StrZMatchPatternA('a[0-9a-z]', 'a9', mpgLazy) = 2);
  25452. Assert(StrZMatchPatternA('a[0-9a-z]', 'a00', mpgLazy) = 2);
  25453. Assert(StrZMatchPatternA('a[0-9a-z]', 'aA', mpgLazy) < 0);
  25454. Assert(StrZMatchPatternA('a[0-9a-z]', 'aA0', mpgLazy) < 0);
  25455. Assert(StrZMatchPatternA('a[0-9a-z]a', 'aaa', mpgLazy) = 3);
  25456. Assert(StrZMatchPatternA('a[0-9a-z]a', 'aa', mpgLazy) < 0);
  25457. Assert(StrZMatchPatternA('a[0-9a-z]a', 'aab', mpgLazy) < 0);
  25458. Assert(StrZMatchPatternA('a[0-9a-z][AB]', 'aaA', mpgLazy) = 3);
  25459. Assert(StrZMatchPatternA('a[0-9a-z][AB]', 'aaC', mpgLazy) < 0);
  25460. Assert(StrZMatchPatternA('\r', #13, mpgLazy) = 1);
  25461. Assert(StrZMatchPatternA('\\', '\', mpgLazy) = 1);
  25462. Assert(StrZMatchPatternA('\.', '.', mpgLazy) = 1);
  25463. Assert(StrZMatchPatternA('[\r]', #13, mpgLazy) = 1);
  25464. Assert(StrZMatchPatternA('[\\]', '\', mpgLazy) = 1);
  25465. Assert(StrZMatchPatternA('[\-]', '-', mpgLazy) = 1);
  25466. Assert(StrZMatchPatternA('[\-]', '\', mpgLazy) < 0);
  25467. Assert(StrZMatchPatternA('[\-\.]', '.', mpgLazy) = 1);
  25468. Assert(StrPosPatternA('', '', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25469. Assert(StrPosPatternA('', 'a', I, 1, mpgGreedy) = 1); Assert(I = 0);
  25470. Assert(StrPosPatternA('a', '', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25471. Assert(StrPosPatternA('a*b', 'xacb', I, 1, mpgGreedy) = 2); Assert(I = 3);
  25472. Assert(StrPosPatternA('a*b', 'xaccbd', I, 1, mpgGreedy) = 2); Assert(I = 4);
  25473. Assert(StrPosPatternA('a*b', 'xa', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25474. Assert(StrPosPatternW('', '', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25475. Assert(StrPosPatternW('', 'a', I, 1, mpgGreedy) = 1); Assert(I = 0);
  25476. Assert(StrPosPatternW('a', '', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25477. Assert(StrPosPatternW('a*b', 'xacb', I, 1, mpgGreedy) = 2); Assert(I = 3);
  25478. Assert(StrPosPatternW('a*b', 'xaccbd', I, 1, mpgGreedy) = 2); Assert(I = 4);
  25479. Assert(StrPosPatternW('a*b', 'xa', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25480. Assert(StrPosPatternU('', '', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25481. Assert(StrPosPatternU('', 'a', I, 1, mpgGreedy) = 1); Assert(I = 0);
  25482. Assert(StrPosPatternU('a', '', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25483. Assert(StrPosPatternU('a*b', 'xacb', I, 1, mpgGreedy) = 2); Assert(I = 3);
  25484. Assert(StrPosPatternU('a*b', 'xaccbd', I, 1, mpgGreedy) = 2); Assert(I = 4);
  25485. Assert(StrPosPatternU('a*b', 'xa', I, 1, mpgGreedy) = 0); Assert(I = 0);
  25486. {$ENDIF}
  25487. { MatchFileMask }
  25488. Assert(MatchFileMaskA('*', 'A'), 'MatchFileMask');
  25489. Assert(MatchFileMaskA('?', 'A'), 'MatchFileMask');
  25490. Assert(MatchFileMaskA('', 'A'), 'MatchFileMask');
  25491. Assert(MatchFileMaskA('', ''), 'MatchFileMask');
  25492. Assert(not MatchFileMaskA('X', ''), 'MatchFileMask');
  25493. Assert(MatchFileMaskA('A?', 'A'), 'MatchFileMask');
  25494. Assert(MatchFileMaskA('A?', 'AB'), 'MatchFileMask');
  25495. Assert(MatchFileMaskA('A*B*C', 'ACBDC'), 'MatchFileMask');
  25496. Assert(MatchFileMaskA('A*B*?', 'ACBDC'), 'MatchFileMask');
  25497. { Escaping }
  25498. Assert(StrHexEscape('ABCDE', ['C', 'D'], '\\', '//', False, True) =
  25499. 'AB\\43//\\44//E', 'StrHexEscape');
  25500. Assert(StrHexEscape('ABCDE', ['C', 'E'], '\', '', False, True) =
  25501. 'AB\43D\45', 'StrHexEscape');
  25502. Assert(StrHexEscape('ABCDE', ['F'], '\', '', False, True) =
  25503. 'ABCDE', 'StrHexEscape');
  25504. Assert(StrHexUnescape('AB\\43\\44XYZ', '\\') = 'ABCDXYZ', 'StrHexUnescape');
  25505. Assert(StrHexUnescape('ABC', '\') = 'ABC', 'StrHexUnescape');
  25506. Assert(StrHexUnescape('ABC\44', '\') = 'ABCD', 'StrHexUnescape');
  25507. Assert(StrCharEscape('ABCDE', ['C', 'D'], '\\', ['c', 'd']) =
  25508. 'AB\\c\\dE', 'StrCharEscape');
  25509. Assert(StrCharEscape('ABCDE', ['C', 'E'], '\', ['c', 'e']) =
  25510. 'AB\cD\e', 'StrCharEscape');
  25511. Assert(StrCharEscape('ABCDE', ['F'], '\', ['f']) =
  25512. 'ABCDE', 'StrCharEscape');
  25513. Assert(StrCharUnescape('AB\\c\\dE', '\\', ['c', 'd'], ['C', 'D'], True, True) =
  25514. 'ABCDE', 'StrCharUnescape');
  25515. { CharClassStr }
  25516. Assert(CharSetToCharClassStr(['a'..'z']) = '[a-z]', 'CharClassStr');
  25517. Assert(CharSetToCharClassStr(CompleteCharSet) = '.', 'CharClassStr');
  25518. Assert(CharSetToCharClassStr([#0..#31]) = '[\x0-\x1F]', 'CharClassStr');
  25519. Assert(CharSetToCharClassStr([#0..#32]) = '[\x0- ]', 'CharClassStr');
  25520. Assert(CharSetToCharClassStr(CompleteCharSet - ['a']) = '[^a]', 'CharClassStr');
  25521. Assert(CharSetToCharClassStr(CompleteCharSet - ['a'..'z']) = '[^a-z]', 'CharClassStr');
  25522. Assert(CharSetToCharClassStr(['a'..'b']) = '[ab]', 'CharClassStr');
  25523. Assert(CharSetToCharClassStr([]) = '[]', 'CharClassStr');
  25524. {$IFNDEF CLR}
  25525. Assert(CharClassStrToCharSet('[a]') = ['a'], 'CharClassStr');
  25526. Assert(CharClassStrToCharSet('[]') = [], 'CharClassStr');
  25527. Assert(CharClassStrToCharSet('.') = CompleteCharSet, 'CharClassStr');
  25528. Assert(CharClassStrToCharSet('') = [], 'CharClassStr');
  25529. Assert(CharClassStrToCharSet('[a-z]') = ['a'..'z'], 'CharClassStr');
  25530. Assert(CharClassStrToCharSet('[^a-z]') = CompleteCharSet - ['a'..'z'], 'CharClassStr');
  25531. Assert(CharClassStrToCharSet('[-]') = ['-'], 'CharClassStr');
  25532. Assert(CharClassStrToCharSet('[a-]') = ['a', '-'], 'CharClassStr');
  25533. Assert(CharClassStrToCharSet('[\x5]') = [#$5], 'CharClassStr');
  25534. Assert(CharClassStrToCharSet('[\x1f]') = [#$1f], 'CharClassStr');
  25535. Assert(CharClassStrToCharSet('[\x10-]') = [#$10, '-'], 'CharClassStr');
  25536. Assert(CharClassStrToCharSet('[\x10-\x1f]') = [#$10..#$1f], 'CharClassStr');
  25537. Assert(CharClassStrToCharSet('[\x10-\xf]') = [], 'CharClassStr');
  25538. {$ENDIF}
  25539. end;
  25540. {$ENDIF}
  25541. end.