123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147(*---------------------------------------------------------------------------
Copyright (c) 2012 The uucd programmers. All rights reserved.
SPDX-License-Identifier: ISC
---------------------------------------------------------------------------*)letstr=Printf.sprintfletstr_of_name(u,l)=str"{%s}%s"ulletsplit_stringssep=letrecsplitaccumj=leti=try(String.rindex_fromsjsep)withNot_found->-1inif(i=-1)thenletp=String.subs0(j+1)inifp<>""thenp::accumelseaccumelseletp=String.subs(i+1)(j-i)inletaccum'=ifp<>""thenp::accumelseaccuminsplitaccum'(i-1)insplit[](String.lengths-1)(* Error messages *)leterrs=failwithsleterr_data="character data not allowed here"leterr_exp_el_end="expected end of element"leterr_exp_data="expected character data"leterr_wf="document not well formed"leterr_dupn=str"duplicate element (%s)"(str_of_namen)leterr_miss_attn=str"missing attribute (%s)"nleterr_att_valv=str"invalid attribute value (\"%s\")"vleterr_invalid_cpv=str"invalid code point (\"%s\")"vleterr_empty_cps="empty code point sequence"leterr_exp_ucdfnd=str"expected ucd element found %s"(str_of_namefnd)leterr_invalid_cp_spec=str"invalid code point specification"leterr_invalid_name_alias_spec=str"invalid name alias specification"(* Code points *)moduleCp=structtypet=intletcompare:int->int->int=compareendtypecp=Cp.tletis_cpi=0x0000<=i&&i<=0x10_FFFFletis_scalar_valuei=(0x0000<=i&&i<=0xD7FF)||(0xE000<=i&&i<=0x10FFFF)letcp_of_stringv=(* parses a code point value. *)letis_hexc=(0x30<=c&&c<=0x39)||(0x41<=c&&c<=0x46)inletcp=ref0infork=0to(String.lengthv)-1doletc=Char.codev.[k]inifnot(is_hexc)thenerr(err_invalid_cpv)elsecp:=!cp*16+(ifc<=0x39thenc-48elsec-55)done;ifis_cp!cpthen!cpelseerr(err_invalid_cpv)letcps_of_string?(empty=false)v=(* parses a code point sequence value. *)if(v="")then(ifemptythen[]elseerrerr_empty_cps)elseList.mapcp_of_string(split_stringv' ')moduleCpmap=Map.Make(Cp)(* Properties *)typekey=(* the type for property keys (names). *)|Age|Alphabetic|Ascii_hex_digit|Bidi_class|Bidi_control|Bidi_mirrored|Bidi_mirroring_glyph|Bidi_paired_bracket|Bidi_paired_bracket_type|Block|Canonical_combining_class|Cased|Case_folding|Case_ignorable|Changes_when_casefolded|Changes_when_casemapped|Changes_when_lowercased|Changes_when_nfkc_casefolded|Changes_when_titlecased|Changes_when_uppercased|Composition_exclusion|Dash|Decomposition_mapping|Decomposition_type|Default_ignorable_code_point|Deprecated|Diacritic|East_asian_width|Emoji|Emoji_presentation|Emoji_modifier|Emoji_modifier_base|Emoji_component|Equivalent_unified_ideograph|Expands_on_nfc|Expands_on_nfd|Expands_on_nfkc|Expands_on_nfkd|Extender|Extended_pictographic|Fc_nfkc_closure|Full_composition_exclusion|General_category|Grapheme_base|Grapheme_cluster_break|Grapheme_extend|Grapheme_link|Hangul_syllable_type|Hex_digit|Hyphen|Id_continue|Id_compat_math_continue|Id_compat_math_start|Id_start|Ideographic|Ids_binary_operator|Ids_trinary_operator|Ids_unary_operator|Indic_conjunct_break|Indic_syllabic_category|Indic_matra_category|Indic_positional_category|Iso_comment|Jamo_short_name|Join_control|Joining_group|Joining_type|Line_break|Logical_order_exception|Lowercase|Lowercase_mapping|Math|Modifier_combining_mark|Name|Name_alias|Nfc_quick_check|Nfd_quick_check|Nfkc_quick_check|Nfkc_casefold|Nfkc_simple_casefold|Nfkd_quick_check|Noncharacter_code_point|Numeric_type|Numeric_value|Other_alphabetic|Other_default_ignorable_code_point|Other_grapheme_extend|Other_id_continue|Other_id_start|Other_lowercase|Other_math|Other_uppercase|Pattern_syntax|Pattern_white_space|Prepended_concatenation_mark|Quotation_mark|Radical|Regional_indicator|Script|Script_extensions|Sentence_break|Simple_case_folding|Simple_lowercase_mapping|Simple_titlecase_mapping|Simple_uppercase_mapping|Soft_dotted|Sterm|Terminal_punctuation|Titlecase_mapping|UAX_42_element|Unicode_1_name|Unified_ideograph|Uppercase|Uppercase_mapping|Variation_selector|Vertical_orientation|White_space|Word_break|Xid_continue|Xid_start(* Unihan *)|KAccountingNumeric|KAlternateHanYu|KAlternateJEF|KAlternateKangXi|KAlternateMorohashi|KAlternateTotalStrokes|KBigFive|KCCCII|KCNS1986|KCNS1992|KCangjie|KCantonese|KCheungBauer|KCheungBauerIndex|KCihaiT|KCompatibilityVariant|KCowles|KDaeJaweon|KDefinition|KEACC|KFanqie|KFenn|KFennIndex|KFourCornerCode|KFrequency|KGB0|KGB1|KGB3|KGB5|KGB7|KGB8|KGSR|KGradeLevel|KHDZRadBreak|KHKGlyph|KHKSCS|KHanYu|KHangul|KHanyuPinlu|KHanyuPinyin|KIBMJapan|KIICore|KIRGDaeJaweon|KIRGDaiKanwaZiten|KIRGHanyuDaZidian|KIRGKangXi|KIRG_GSource|KIRG_HSource|KIRG_JSource|KIRG_KPSource|KIRG_KSource|KIRG_MSource|KIRG_SSource|KIRG_TSource|KIRG_USource|KIRG_UKSource|KIRG_VSource|KJapanese|KJHJ|KJIS0213|KJa|KJapaneseKun|KJapaneseOn|KJinmeiyoKanji|KJis0|KJis1|KJoyoKanji|KKPS0|KKPS1|KKSC0|KKSC1|KKangXi|KKarlgren|KKorean|KKoreanEducationHanja|KKoreanName|KLau|KMainlandTelegraph|KMandarin|KMatthews|KMeyerWempe|KMojiJoho|KMorohashi|KNelson|KOtherNumeric|KPhonetic|KPrimaryNumeric|KPseudoGB1|KRSAdobe_Japan1_6|KRSJapanese|KRSKanWa|KRSKangXi|KRSKorean|KRSMerged|KRSTUnicode|KRSUnicode|KReading|KSBGY|KSemanticVariant|KSimplifiedVariant|KSMSZD2003Index|KSMSZD2003Readings|KSpecializedSemanticVariant|KSpoofingVariant|KSrc_NushuDuben|KStrange|KTGH|KTGHZ2013|KTGT_MergedSrc|KTaiwanTelegraph|KTang|KTotalStrokes|KTraditionalVariant|KUnihanCore2020|KVietnamese|KVietnameseNumeric|KWubi|KXHC1983|KXerox|KZhuang|KZhuangNumeric|KZVariant|Otherof(string*string)(* expanded XML name. *)typescript=[|`Adlm|`Aghb|`Ahom|`Arab|`Armi|`Armn|`Avst|`Bali|`Bamu|`Bass|`Batk|`Beng|`Bhks|`Bopo|`Brah|`Brai|`Bugi|`Buhd|`Cakm|`Cans|`Cari|`Cham|`Cher|`Chrs|`Copt|`Cpmn|`Cprt|`Cyrl|`Deva|`Diak|`Dogr|`Dsrt|`Dupl|`Egyp|`Elba|`Elym|`Ethi|`Gara|`Geor|`Glag|`Gong|`Gonm|`Goth|`Gran|`Grek|`Gujr|`Gukh|`Guru|`Hang|`Hani|`Hano|`Hatr|`Hebr|`Hira|`Hluw|`Hmng|`Hmnp|`Hrkt|`Hung|`Ital|`Java|`Kali|`Kana|`Kawi|`Khar|`Khmr|`Khoj|`Knda|`Krai|`Kthi|`Kits|`Lana|`Laoo|`Latn|`Lepc|`Limb|`Lina|`Linb|`Lisu|`Lyci|`Lydi|`Mahj|`Maka|`Mand|`Mani|`Marc|`Medf|`Mend|`Merc|`Mero|`Mlym|`Modi|`Mong|`Mroo|`Mtei|`Mult|`Mymr|`Nagm|`Nand|`Narb|`Nbat|`Newa|`Nkoo|`Nshu|`Ogam|`Olck|`Onao|`Orkh|`Orya|`Osge|`Osma|`Ougr|`Palm|`Pauc|`Perm|`Phag|`Phli|`Phlp|`Phnx|`Plrd|`Prti|`Qaai|`Rjng|`Rohg|`Runr|`Samr|`Sarb|`Saur|`Sgnw|`Shaw|`Shrd|`Sidd|`Sind|`Sinh|`Sogd|`Sogo|`Sora|`Soyo|`Sund|`Sunu|`Sylo|`Syrc|`Tagb|`Takr|`Tale|`Talu|`Taml|`Tang|`Tavt|`Telu|`Tfng|`Tglg|`Thaa|`Thai|`Tibt|`Tirh|`Tnsa|`Todr|`Toto|`Tutg|`Ugar|`Vaii|`Vith|`Wara|`Wcho|`Xpeo|`Xsux|`Yezi|`Yiii|`Zanb|`Zinh|`Zyyy|`Zzzz]typeblock_prop=[|`ASCII|`Adlam|`Aegean_Numbers|`Ahom|`Alchemical|`Alphabetic_PF|`Anatolian_Hieroglyphs|`Ancient_Greek_Music|`Ancient_Greek_Numbers|`Ancient_Symbols|`Arabic|`Arabic_Ext_A|`Arabic_Ext_B|`Arabic_Ext_C|`Arabic_Math|`Arabic_PF_A|`Arabic_PF_B|`Arabic_Sup|`Armenian|`Arrows|`Avestan|`Balinese|`Bamum|`Bamum_Sup|`Bassa_Vah|`Batak|`Bengali|`Bhaiksuki|`Block_Elements|`Bopomofo|`Bopomofo_Ext|`Box_Drawing|`Brahmi|`Braille|`Buginese|`Buhid|`Byzantine_Music|`CJK|`CJK_Compat|`CJK_Compat_Forms|`CJK_Compat_Ideographs|`CJK_Compat_Ideographs_Sup|`CJK_Ext_A|`CJK_Ext_B|`CJK_Ext_C|`CJK_Ext_D|`CJK_Ext_E|`CJK_Ext_F|`CJK_Ext_G|`CJK_Ext_H|`CJK_Ext_I|`CJK_Radicals_Sup|`CJK_Strokes|`CJK_Symbols|`Carian|`Caucasian_Albanian|`Chakma|`Cham|`Cherokee|`Cherokee_Sup|`Chess_Symbols|`Chorasmian|`Compat_Jamo|`Control_Pictures|`Coptic|`Coptic_Epact_Numbers|`Counting_Rod|`Cuneiform|`Cuneiform_Numbers|`Currency_Symbols|`Cypriot_Syllabary|`Cypro_Minoan|`Cyrillic|`Cyrillic_Ext_A|`Cyrillic_Ext_B|`Cyrillic_Ext_C|`Cyrillic_Ext_D|`Cyrillic_Sup|`Deseret|`Devanagari|`Devanagari_Ext|`Devanagari_Ext_A|`Diacriticals|`Diacriticals_Ext|`Diacriticals_For_Symbols|`Diacriticals_Sup|`Dingbats|`Dives_Akuru|`Dogra|`Domino|`Duployan|`Early_Dynastic_Cuneiform|`Egyptian_Hieroglyph_Format_Controls|`Egyptian_Hieroglyphs|`Egyptian_Hieroglyphs_Ext_A|`Elbasan|`Elymaic|`Emoticons|`Enclosed_Alphanum|`Enclosed_Alphanum_Sup|`Enclosed_CJK|`Enclosed_Ideographic_Sup|`Ethiopic|`Ethiopic_Ext|`Ethiopic_Ext_A|`Ethiopic_Ext_B|`Ethiopic_Sup|`Garay|`Geometric_Shapes|`Geometric_Shapes_Ext|`Georgian|`Georgian_Ext|`Georgian_Sup|`Glagolitic|`Glagolitic_Sup|`Gothic|`Grantha|`Greek|`Greek_Ext|`Gujarati|`Gunjala_Gondi|`Gurmukhi|`Gurung_Khema|`Half_And_Full_Forms|`Half_Marks|`Hangul|`Hanifi_Rohingya|`Hanunoo|`Hatran|`Hebrew|`High_PU_Surrogates|`High_Surrogates|`Hiragana|`IDC|`IPA_Ext|`Ideographic_Symbols|`Imperial_Aramaic|`Indic_Number_Forms|`Indic_Siyaq_Numbers|`Inscriptional_Pahlavi|`Inscriptional_Parthian|`Jamo|`Jamo_Ext_A|`Jamo_Ext_B|`Javanese|`Kaithi|`Kaktovik_Numerals|`Kana_Ext_A|`Kana_Ext_B|`Kana_Sup|`Kanbun|`Kangxi|`Kannada|`Katakana|`Katakana_Ext|`Kawi|`Kayah_Li|`Kharoshthi|`Khitan_Small_Script|`Khmer|`Khmer_Symbols|`Khojki|`Khudawadi|`Kirat_Rai|`Lao|`Latin_1_Sup|`Latin_Ext_A|`Latin_Ext_Additional|`Latin_Ext_B|`Latin_Ext_C|`Latin_Ext_D|`Latin_Ext_E|`Latin_Ext_F|`Latin_Ext_G|`Lepcha|`Letterlike_Symbols|`Limbu|`Linear_A|`Linear_B_Ideograms|`Linear_B_Syllabary|`Lisu|`Lisu_Sup|`Low_Surrogates|`Lycian|`Lydian|`Mahajani|`Mahjong|`Makasar|`Malayalam|`Mandaic|`Manichaean|`Marchen|`Masaram_Gondi|`Math_Alphanum|`Math_Operators|`Mayan_Numerals|`Medefaidrin|`Meetei_Mayek|`Meetei_Mayek_Ext|`Mende_Kikakui|`Meroitic_Cursive|`Meroitic_Hieroglyphs|`Miao|`Misc_Arrows|`Misc_Math_Symbols_A|`Misc_Math_Symbols_B|`Misc_Pictographs|`Misc_Symbols|`Misc_Technical|`Modi|`Modifier_Letters|`Modifier_Tone_Letters|`Mongolian|`Mongolian_Sup|`Mro|`Multani|`Music|`Myanmar|`Myanmar_Ext_A|`Myanmar_Ext_B|`Myanmar_Ext_C|`NB|`NKo|`Nabataean|`Nag_Mundari|`Nandinagari|`New_Tai_Lue|`Newa|`Number_Forms|`Nushu|`Nyiakeng_Puachue_Hmong|`OCR|`Ogham|`Ol_Onal|`Ol_Chiki|`Old_Hungarian|`Old_Italic|`Old_North_Arabian|`Old_Permic|`Old_Persian|`Old_Sogdian|`Old_South_Arabian|`Old_Turkic|`Old_Uyghur|`Oriya|`Ornamental_Dingbats|`Osage|`Osmanya|`Ottoman_Siyaq_Numbers|`PUA|`Pahawh_Hmong|`Palmyrene|`Pau_Cin_Hau|`Phags_Pa|`Phaistos|`Phoenician|`Phonetic_Ext|`Phonetic_Ext_Sup|`Playing_Cards|`Psalter_Pahlavi|`Punctuation|`Rejang|`Rumi|`Runic|`Samaritan|`Saurashtra|`Sharada|`Shavian|`Shorthand_Format_Controls|`Siddham|`Sinhala|`Sinhala_Archaic_Numbers|`Small_Forms|`Small_Kana_Ext|`Sogdian|`Sora_Sompeng|`Soyombo|`Specials|`Sundanese|`Sundanese_Sup|`Sunuwar|`Sup_Arrows_A|`Sup_Arrows_B|`Sup_Arrows_C|`Sup_Math_Operators|`Sup_PUA_A|`Sup_PUA_B|`Sup_Punctuation|`Sup_Symbols_And_Pictographs|`Super_And_Sub|`Sutton_SignWriting|`Syloti_Nagri|`Symbols_And_Pictographs_Ext_A|`Symbols_For_Legacy_Computing|`Symbols_For_Legacy_Computing_Sup|`Syriac|`Syriac_Sup|`Tagalog|`Tagbanwa|`Tags|`Tai_Le|`Tai_Tham|`Tai_Viet|`Tai_Xuan_Jing|`Takri|`Tamil|`Tamil_Sup|`Tangsa|`Tangut|`Tangut_Components|`Tangut_Sup|`Telugu|`Thaana|`Thai|`Tibetan|`Tifinagh|`Tirhuta|`Todhri|`Toto|`Transport_And_Map|`Tulu_Tigalari|`UCAS|`UCAS_Ext|`UCAS_Ext_A|`Ugaritic|`VS|`VS_Sup|`Vai|`Vedic_Ext|`Vertical_Forms|`Vithkuqi|`Wancho|`Warang_Citi|`Yezidi|`Yi_Radicals|`Yi_Syllables|`Yijing|`Zanabazar_Square|`Znamenny_Music]typevalue=(* the type for property values. *)|Age_vof[`Versionofint*int|`Unassigned]|Block_vofblock_prop|Bidi_class_vof[|`AL|`AN|`B|`BN|`CS|`EN|`ES|`ET|`L|`LRE|`LRO|`NSM|`ON|`PDF|`R|`RLE|`RLO|`S|`WS|`LRI|`RLI|`FSI|`PDI]|Bidi_paired_bracket_type_vof[`O|`C|`N]|Bool_vofbool|Bool_maybe_vof[`True|`False|`Maybe]|Cp_vofcp|Cp_map_vof[`Self|`Cpofcp]|Cp_opt_vofcpoption|Decomposition_type_vof[|`Can|`Com|`Enc|`Fin|`Font|`Fra|`Init|`Iso|`Med|`Nar|`Nb|`Sml|`Sqr|`Sub|`Sup|`Vert|`Wide|`None]|East_asian_width_vof[`A|`F|`H|`N|`Na|`W]|General_category_vof[|`Lu|`Ll|`Lt|`Lm|`Lo|`Mn|`Mc|`Me|`Nd|`Nl|`No|`Pc|`Pd|`Ps|`Pe|`Pi|`Pf|`Po|`Sm|`Sc|`Sk|`So|`Zs|`Zl|`Zp|`Cc|`Cf|`Cs|`Co|`Cn]|Grapheme_cluster_break_vof[|`CN|`CR|`EB|`EBG|`EM|`EX|`GAZ|`L|`LF|`LV|`LVT|`PP|`RI|`SM|`T|`V|`XX|`ZWJ]|Hangul_syllable_type_vof[`L|`LV|`LVT|`T|`V|`NA]|Int_vofint|Indic_conjunct_break_vof[`Consonant|`Extend|`Linker|`None]|Indic_syllabic_category_vof[`Avagraha|`Bindu|`Brahmi_Joining_Number|`Cantillation_Mark|`Consonant|`Consonant_Dead|`Consonant_Final|`Consonant_Head_Letter|`Consonant_Initial_Postfixed|`Consonant_Killer|`Consonant_Medial|`Consonant_Placeholder|`Consonant_Preceding_Repha|`Consonant_Prefixed|`Consonant_Repha|`Consonant_Subjoined|`Consonant_Succeeding_Repha|`Consonant_With_Stacker|`Gemination_Mark|`Invisible_Stacker|`Joiner|`Modifying_Letter|`Non_Joiner|`Nukta|`Number|`Number_Joiner|`Other|`Pure_Killer|`Reordering_Killer|`Register_Shifter|`Syllable_Modifier|`Tone_Letter|`Tone_Mark|`Virama|`Visarga|`Vowel|`Vowel_Dependent|`Vowel_Independent]|Indic_matra_category_vof[|`Right|`Left|`Visual_Order_Left|`Left_And_Right|`Top|`Bottom|`Top_And_Bottom|`Top_And_Right|`Top_And_Left|`Top_And_Left_And_Right|`Bottom_And_Right|`Top_And_Bottom_And_Right|`Overstruck|`Invisible|`NA]|Indic_positional_category_vof[|`Bottom|`Bottom_And_Left|`Bottom_And_Right|`Left|`Left_And_Right|`NA|`Overstruck|`Right|`Top|`Top_And_Bottom|`Top_And_Bottom_And_Left|`Top_And_Bottom_And_Right|`Top_And_Left|`Top_And_Left_And_Right|`Top_And_Right|`Visual_Order_Left]|Joining_group_vof[|`African_Feh|`African_Noon|`African_Qaf|`Ain|`Alaph|`Alef|`Alef_Maqsurah|`Beh|`Beth|`Burushaski_Yeh_Barree|`Dal|`Dalath_Rish|`E|`Farsi_Yeh|`Fe|`Feh|`Final_Semkath|`Gaf|`Gamal|`Hah|`Hanifi_Rohingya_Kinna_Ya|`Hanifi_Rohingya_Pa|`Hamza_On_Heh_Goal|`He|`Heh|`Heh_Goal|`Heth|`Kaf|`Kaph|`Kashmiri_Yeh|`Khaph|`Knotted_Heh|`Lam|`Lamadh|`Malayalam_Bha|`Malayalam_Ja|`Malayalam_Lla|`Malayalam_Llla|`Malayalam_Nga|`Malayalam_Nna|`Malayalam_Nnna|`Malayalam_Nya|`Malayalam_Ra|`Malayalam_Ssa|`Malayalam_Tta|`Manichaean_Aleph|`Manichaean_Ayin|`Manichaean_Beth|`Manichaean_Daleth|`Manichaean_Dhamedh|`Manichaean_Five|`Manichaean_Gimel|`Manichaean_Heth|`Manichaean_Hundred|`Manichaean_Kaph|`Manichaean_Lamedh|`Manichaean_Mem|`Manichaean_Nun|`Manichaean_One|`Manichaean_Pe|`Manichaean_Qoph|`Manichaean_Resh|`Manichaean_Sadhe|`Manichaean_Samekh|`Manichaean_Taw|`Manichaean_Ten|`Manichaean_Teth|`Manichaean_Thamedh|`Manichaean_Twenty|`Manichaean_Waw|`Manichaean_Yodh|`Manichaean_Zayin|`Meem|`Mim|`No_Joining_Group|`Noon|`Nun|`Nya|`Pe|`Qaf|`Qaph|`Reh|`Reversed_Pe|`Rohingya_Yeh|`Sad|`Sadhe|`Seen|`Semkath|`Shin|`Straight_Waw|`Swash_Kaf|`Syriac_Waw|`Tah|`Taw|`Teh_Marbuta|`Teh_Marbuta_Goal|`Teth|`Thin_Yeh|`Vertical_Tail|`Waw|`Yeh|`Yeh_Barree|`Yeh_With_Tail|`Yudh|`Yudh_He|`Zain|`Zhain]|Joining_type_vof[`U|`C|`T|`D|`L|`R]|Line_break_vof[|`AI|`AK|`AL|`AP|`AS|`B2|`BA|`BB|`BK|`CB|`CJ|`CL|`CM|`CP|`CR|`EB|`EM|`EX|`GL|`H2|`H3|`HL|`HY|`ID|`IN|`IS|`JL|`JT|`JV|`LF|`NL|`NS|`NU|`OP|`PO|`PR|`QU|`RI|`SA|`SG|`SP|`SY|`VF|`VI|`WJ|`XX|`ZW|`ZWJ]|Name_vof[`Patternofstring|`Nameofstring]|Name_alias_vof(string*[`Abbreviation|`Alternate|`Control|`Correction|`Figment])list|Numeric_type_vof[`None|`De|`Di|`Nu]|Numeric_value_vof[`NaN|`Numsof[`Fracofint*int|`Numofint64]list]|Script_vofscript|Script_extensions_vofscriptlist|Sentence_break_vof[|`AT|`CL|`CR|`EX|`FO|`LE|`LF|`LO|`NU|`SC|`SE|`SP|`ST|`UP|`XX]|Cps_vofcplist|Cps_map_vof[`Self|`Cpsofcplist]|String_vofstring|UAX_42_element_vof[`Reserved|`Noncharacter|`Surrogate|`Char]|Vertical_orientation_vof[`U|`R|`Tu|`Tr]|Word_break_vof[|`CR|`DQ|`EB|`EBG|`EM|`EX|`Extend|`FO|`GAZ|`HL|`KA|`LE|`LF|`MB|`ML|`MN|`NL|`NU|`RI|`SQ|`WSegSpace|`XX|`ZWJ](* property value projection *)leto_age=functionAge_vv->v|_->assertfalseleto_bidi_class=functionBidi_class_vv->v|_->assertfalseleto_bidi_paired_bracket_type=functionBidi_paired_bracket_type_vv->v|_->assertfalseleto_block=functionBlock_vv->v|_->assertfalseleto_bool=functionBool_vv->v|_->assertfalseleto_bool_maybe=functionBool_maybe_vv->v|_->assertfalseleto_cp=functionCp_vv->v|_->assertfalseleto_cp_map=functionCp_map_vv->v|_->assertfalseleto_cp_opt=functionCp_opt_vv->v|_->assertfalseleto_decomposition_type=functionDecomposition_type_vv->v|_->assertfalseleto_east_asian_width=functionEast_asian_width_vv->v|_->assertfalseleto_general_category=functionGeneral_category_vv->v|_->assertfalseleto_grapheme_cluster_break=functionGrapheme_cluster_break_vv->v|_->assertfalseleto_hangul_syllable_type=functionHangul_syllable_type_vv->v|_->assertfalseleto_int=functionInt_vv->v|_->assertfalseleto_indic_conjunct_break=functionIndic_conjunct_break_vv->v|_->assertfalseleto_indic_syllabic_category=functionIndic_syllabic_category_vv->v|_->assertfalseleto_indic_matra_category=functionIndic_matra_category_vv->v|_->assertfalseleto_indic_positional_category=functionIndic_positional_category_vv->v|_->assertfalseleto_joining_group=functionJoining_group_vv->v|_->assertfalseleto_joining_type=functionJoining_type_vv->v|_->assertfalseleto_line_break=functionLine_break_vv->v|_->assertfalseleto_name=functionName_vv->v|_->assertfalseleto_name_alias=functionName_alias_vv->v|_->assertfalseleto_numeric_type=functionNumeric_type_vv->v|_->assertfalseleto_numeric_value=functionNumeric_value_vv->v|_->assertfalseleto_script=functionScript_vv->v|_->assertfalseleto_script_extensions=functionScript_extensions_vv->v|_->assertfalseleto_sentence_break=functionSentence_break_vv->v|_->assertfalseleto_cps=functionCps_vv->v|_->assertfalseleto_cps_map=functionCps_map_vv->v|_->assertfalseleto_string=functionString_vv->v|_->assertfalseleto_uax_42_element=functionUAX_42_element_vv->v|_->assertfalseleto_vertical_orientation=functionVertical_orientation_vv->v|_->assertfalseleto_word_break=functionWord_break_vv->v|_->assertfalse(* property value injection *)leti_agev=Age_vbeginmatchvwith|"unassigned"->`Unassigned|v->trymatchList.mapint_of_string(split_stringv'.')with|[v1;v2;]->`Version(v1,v2)|_->failwith""withFailure_->err(err_att_valv)endleti_bidi_classv=Bidi_class_vbeginmatchvwith|"AL"->`AL|"AN"->`AN|"B"->`B|"BN"->`BN|"CS"->`CS|"EN"->`EN|"ES"->`ES|"ET"->`ET|"L"->`L|"LRE"->`LRE|"LRO"->`LRO|"NSM"->`NSM|"ON"->`ON|"PDF"->`PDF|"R"->`R|"RLE"->`RLE|"RLO"->`RLO|"S"->`S|"WS"->`WS|"LRI"->`LRI|"RLI"->`RLI|"FSI"->`FSI|"PDI"->`PDI|v->err(err_att_valv)endleti_bidi_paired_bracket_typev=Bidi_paired_bracket_type_vbeginmatchvwith|"o"->`O|"c"->`C|"n"->`N|v->err(err_att_valv)endleti_blockv=Block_vbeginmatchvwith|"ASCII"->`ASCII|"Adlam"->`Adlam|"Aegean_Numbers"->`Aegean_Numbers|"Ahom"->`Ahom|"Alchemical"->`Alchemical|"Alphabetic_PF"->`Alphabetic_PF|"Anatolian_Hieroglyphs"->`Anatolian_Hieroglyphs|"Ancient_Greek_Music"->`Ancient_Greek_Music|"Ancient_Greek_Numbers"->`Ancient_Greek_Numbers|"Ancient_Symbols"->`Ancient_Symbols|"Arabic"->`Arabic|"Arabic_Ext_A"->`Arabic_Ext_A|"Arabic_Ext_B"->`Arabic_Ext_A|"Arabic_Ext_C"->`Arabic_Ext_C|"Arabic_Math"->`Arabic_Math|"Arabic_PF_A"->`Arabic_PF_A|"Arabic_PF_B"->`Arabic_PF_B|"Arabic_Sup"->`Arabic_Sup|"Armenian"->`Armenian|"Arrows"->`Arrows|"Avestan"->`Avestan|"Balinese"->`Balinese|"Bamum"->`Bamum|"Bamum_Sup"->`Bamum_Sup|"Bassa_Vah"->`Bassa_Vah|"Batak"->`Batak|"Bengali"->`Bengali|"Bhaiksuki"->`Bhaiksuki|"Block_Elements"->`Block_Elements|"Bopomofo"->`Bopomofo|"Bopomofo_Ext"->`Bopomofo_Ext|"Box_Drawing"->`Box_Drawing|"Brahmi"->`Brahmi|"Braille"->`Braille|"Buginese"->`Buginese|"Buhid"->`Buhid|"Byzantine_Music"->`Byzantine_Music|"CJK"->`CJK|"CJK_Compat"->`CJK_Compat|"CJK_Compat_Forms"->`CJK_Compat_Forms|"CJK_Compat_Ideographs"->`CJK_Compat_Ideographs|"CJK_Compat_Ideographs_Sup"->`CJK_Compat_Ideographs_Sup|"CJK_Ext_A"->`CJK_Ext_A|"CJK_Ext_B"->`CJK_Ext_B|"CJK_Ext_C"->`CJK_Ext_C|"CJK_Ext_D"->`CJK_Ext_D|"CJK_Ext_E"->`CJK_Ext_E|"CJK_Ext_F"->`CJK_Ext_F|"CJK_Ext_G"->`CJK_Ext_G|"CJK_Ext_H"->`CJK_Ext_H|"CJK_Ext_I"->`CJK_Ext_I|"CJK_Radicals_Sup"->`CJK_Radicals_Sup|"CJK_Strokes"->`CJK_Strokes|"CJK_Symbols"->`CJK_Symbols|"Carian"->`Carian|"Caucasian_Albanian"->`Caucasian_Albanian|"Chakma"->`Chakma|"Cham"->`Cham|"Cherokee"->`Cherokee|"Cherokee_Sup"->`Cherokee_Sup|"Chess_Symbols"->`Chess_Symbols|"Chorasmian"->`Chorasmian|"Compat_Jamo"->`Compat_Jamo|"Control_Pictures"->`Control_Pictures|"Coptic"->`Coptic|"Coptic_Epact_Numbers"->`Coptic_Epact_Numbers|"Counting_Rod"->`Counting_Rod|"Cuneiform"->`Cuneiform|"Cuneiform_Numbers"->`Cuneiform_Numbers|"Currency_Symbols"->`Currency_Symbols|"Cypriot_Syllabary"->`Cypriot_Syllabary|"Cypro_Minoan"->`Cypro_Minoan|"Cyrillic"->`Cyrillic|"Cyrillic_Ext_A"->`Cyrillic_Ext_A|"Cyrillic_Ext_B"->`Cyrillic_Ext_B|"Cyrillic_Ext_C"->`Cyrillic_Ext_C|"Cyrillic_Ext_D"->`Cyrillic_Ext_D|"Cyrillic_Sup"->`Cyrillic_Sup|"Deseret"->`Deseret|"Devanagari"->`Devanagari|"Devanagari_Ext"->`Devanagari_Ext|"Devanagari_Ext_A"->`Devanagari_Ext_A|"Diacriticals"->`Diacriticals|"Diacriticals_Ext"->`Diacriticals_Ext|"Diacriticals_For_Symbols"->`Diacriticals_For_Symbols|"Diacriticals_Sup"->`Diacriticals_Sup|"Dingbats"->`Dingbats|"Dives_Akuru"->`Dives_Akuru|"Dogra"->`Dogra|"Domino"->`Domino|"Duployan"->`Duployan|"Early_Dynastic_Cuneiform"->`Early_Dynastic_Cuneiform|"Egyptian_Hieroglyph_Format_Controls"->`Egyptian_Hieroglyph_Format_Controls|"Egyptian_Hieroglyphs"->`Egyptian_Hieroglyphs|"Egyptian_Hieroglyphs_Ext_A"->`Egyptian_Hieroglyphs_Ext_A|"Elbasan"->`Elbasan|"Elymaic"->`Elymaic|"Emoticons"->`Emoticons|"Enclosed_Alphanum"->`Enclosed_Alphanum|"Enclosed_Alphanum_Sup"->`Enclosed_Alphanum_Sup|"Enclosed_CJK"->`Enclosed_CJK|"Enclosed_Ideographic_Sup"->`Enclosed_Ideographic_Sup|"Ethiopic"->`Ethiopic|"Ethiopic_Ext"->`Ethiopic_Ext|"Ethiopic_Ext_A"->`Ethiopic_Ext_A|"Ethiopic_Ext_B"->`Ethiopic_Ext_B|"Ethiopic_Sup"->`Ethiopic_Sup|"Garay"->`Garay|"Geometric_Shapes"->`Geometric_Shapes|"Geometric_Shapes_Ext"->`Geometric_Shapes_Ext|"Georgian"->`Georgian|"Georgian_Ext"->`Georgian_Ext|"Georgian_Sup"->`Georgian_Sup|"Glagolitic"->`Glagolitic|"Glagolitic_Sup"->`Glagolitic_Sup|"Gothic"->`Gothic|"Grantha"->`Grantha|"Greek"->`Greek|"Greek_Ext"->`Greek_Ext|"Gujarati"->`Gujarati|"Gunjala_Gondi"->`Gunjala_Gondi|"Gurmukhi"->`Gurmukhi|"Gurung_Khema"->`Gurung_Khema|"Half_And_Full_Forms"->`Half_And_Full_Forms|"Half_Marks"->`Half_Marks|"Hangul"->`Hangul|"Hanifi_Rohingya"->`Hanifi_Rohingya|"Hanunoo"->`Hanunoo|"Hatran"->`Hatran|"Hebrew"->`Hebrew|"High_PU_Surrogates"->`High_PU_Surrogates|"High_Surrogates"->`High_Surrogates|"Hiragana"->`Hiragana|"IDC"->`IDC|"IPA_Ext"->`IPA_Ext|"Ideographic_Symbols"->`Ideographic_Symbols|"Imperial_Aramaic"->`Imperial_Aramaic|"Indic_Number_Forms"->`Indic_Number_Forms|"Indic_Siyaq_Numbers"->`Indic_Siyaq_Numbers|"Inscriptional_Pahlavi"->`Inscriptional_Pahlavi|"Inscriptional_Parthian"->`Inscriptional_Parthian|"Jamo"->`Jamo|"Jamo_Ext_A"->`Jamo_Ext_A|"Jamo_Ext_B"->`Jamo_Ext_B|"Javanese"->`Javanese|"Kaithi"->`Kaithi|"Kaktovik_Numerals"->`Kaktovik_Numerals|"Kana_Ext_A"->`Kana_Ext_A|"Kana_Ext_B"->`Kana_Ext_B|"Kawi"->`Kawi|"Kana_Sup"->`Kana_Sup|"Kanbun"->`Kanbun|"Kangxi"->`Kangxi|"Kannada"->`Kannada|"Katakana"->`Katakana|"Katakana_Ext"->`Katakana_Ext|"Kayah_Li"->`Kayah_Li|"Kharoshthi"->`Kharoshthi|"Khitan_Small_Script"->`Khitan_Small_Script|"Khmer"->`Khmer|"Khmer_Symbols"->`Khmer_Symbols|"Khojki"->`Khojki|"Khudawadi"->`Khudawadi|"Kirat_Rai"->`Kirat_Rai|"Lao"->`Lao|"Latin_1_Sup"->`Latin_1_Sup|"Latin_Ext_A"->`Latin_Ext_A|"Latin_Ext_Additional"->`Latin_Ext_Additional|"Latin_Ext_B"->`Latin_Ext_B|"Latin_Ext_C"->`Latin_Ext_C|"Latin_Ext_D"->`Latin_Ext_D|"Latin_Ext_E"->`Latin_Ext_E|"Latin_Ext_F"->`Latin_Ext_F|"Latin_Ext_G"->`Latin_Ext_G|"Lepcha"->`Lepcha|"Letterlike_Symbols"->`Letterlike_Symbols|"Limbu"->`Limbu|"Linear_A"->`Linear_A|"Linear_B_Ideograms"->`Linear_B_Ideograms|"Linear_B_Syllabary"->`Linear_B_Syllabary|"Lisu"->`Lisu|"Lisu_Sup"->`Lisu_Sup|"Low_Surrogates"->`Low_Surrogates|"Lycian"->`Lycian|"Lydian"->`Lydian|"Mahajani"->`Mahajani|"Mahjong"->`Mahjong|"Makasar"->`Makasar|"Malayalam"->`Malayalam|"Mandaic"->`Mandaic|"Manichaean"->`Manichaean|"Marchen"->`Marchen|"Masaram_Gondi"->`Masaram_Gondi|"Math_Alphanum"->`Math_Alphanum|"Math_Operators"->`Math_Operators|"Mayan_Numerals"->`Mayan_Numerals|"Medefaidrin"->`Medefaidrin|"Meetei_Mayek"->`Meetei_Mayek|"Meetei_Mayek_Ext"->`Meetei_Mayek_Ext|"Mende_Kikakui"->`Mende_Kikakui|"Meroitic_Cursive"->`Meroitic_Cursive|"Meroitic_Hieroglyphs"->`Meroitic_Hieroglyphs|"Miao"->`Miao|"Misc_Arrows"->`Misc_Arrows|"Misc_Math_Symbols_A"->`Misc_Math_Symbols_A|"Misc_Math_Symbols_B"->`Misc_Math_Symbols_B|"Misc_Pictographs"->`Misc_Pictographs|"Misc_Symbols"->`Misc_Symbols|"Misc_Technical"->`Misc_Technical|"Modi"->`Modi|"Modifier_Letters"->`Modifier_Letters|"Modifier_Tone_Letters"->`Modifier_Tone_Letters|"Mongolian"->`Mongolian|"Mongolian_Sup"->`Mongolian_Sup|"Mro"->`Mro|"Multani"->`Multani|"Music"->`Music|"Myanmar"->`Myanmar|"Myanmar_Ext_A"->`Myanmar_Ext_A|"Myanmar_Ext_B"->`Myanmar_Ext_B|"Myanmar_Ext_C"->`Myanmar_Ext_C|"NB"->`NB|"NKo"->`NKo|"Nabataean"->`Nabataean|"Nag_Mundari"->`Nag_Mundari|"Nandinagari"->`Nandinagari|"New_Tai_Lue"->`New_Tai_Lue|"Newa"->`Newa|"Number_Forms"->`Number_Forms|"Nushu"->`Nushu|"Nyiakeng_Puachue_Hmong"->`Nyiakeng_Puachue_Hmong|"OCR"->`OCR|"Ogham"->`Ogham|"Ol_Chiki"->`Ol_Chiki|"Ol_Onal"->`Ol_Onal|"Old_Hungarian"->`Old_Hungarian|"Old_Italic"->`Old_Italic|"Old_North_Arabian"->`Old_North_Arabian|"Old_Permic"->`Old_Permic|"Old_Persian"->`Old_Persian|"Old_Sogdian"->`Old_Sogdian|"Old_South_Arabian"->`Old_South_Arabian|"Old_Turkic"->`Old_Turkic|"Old_Uyghur"->`Old_Uyghur|"Oriya"->`Oriya|"Ornamental_Dingbats"->`Ornamental_Dingbats|"Osage"->`Osage|"Osmanya"->`Osmanya|"Ottoman_Siyaq_Numbers"->`Ottoman_Siyaq_Numbers|"PUA"->`PUA|"Pahawh_Hmong"->`Pahawh_Hmong|"Palmyrene"->`Palmyrene|"Pau_Cin_Hau"->`Pau_Cin_Hau|"Phags_Pa"->`Phags_Pa|"Phaistos"->`Phaistos|"Phoenician"->`Phoenician|"Phonetic_Ext"->`Phonetic_Ext|"Phonetic_Ext_Sup"->`Phonetic_Ext_Sup|"Playing_Cards"->`Playing_Cards|"Psalter_Pahlavi"->`Psalter_Pahlavi|"Punctuation"->`Punctuation|"Rejang"->`Rejang|"Rumi"->`Rumi|"Runic"->`Runic|"Samaritan"->`Samaritan|"Saurashtra"->`Saurashtra|"Sharada"->`Sharada|"Shavian"->`Shavian|"Shorthand_Format_Controls"->`Shorthand_Format_Controls|"Siddham"->`Siddham|"Sinhala"->`Sinhala|"Sinhala_Archaic_Numbers"->`Sinhala_Archaic_Numbers|"Small_Forms"->`Small_Forms|"Small_Kana_Ext"->`Small_Kana_Ext|"Sogdian"->`Sogdian|"Sora_Sompeng"->`Sora_Sompeng|"Soyombo"->`Soyombo|"Specials"->`Specials|"Sundanese"->`Sundanese|"Sundanese_Sup"->`Sundanese_Sup|"Sunuwar"->`Sunuwar|"Sup_Arrows_A"->`Sup_Arrows_A|"Sup_Arrows_B"->`Sup_Arrows_B|"Sup_Arrows_C"->`Sup_Arrows_C|"Sup_Math_Operators"->`Sup_Math_Operators|"Sup_PUA_A"->`Sup_PUA_A|"Sup_PUA_B"->`Sup_PUA_B|"Sup_Punctuation"->`Sup_Punctuation|"Sup_Symbols_And_Pictographs"->`Sup_Symbols_And_Pictographs|"Super_And_Sub"->`Super_And_Sub|"Sutton_SignWriting"->`Sutton_SignWriting|"Syloti_Nagri"->`Syloti_Nagri|"Symbols_And_Pictographs_Ext_A"->`Symbols_And_Pictographs_Ext_A|"Symbols_For_Legacy_Computing"->`Symbols_For_Legacy_Computing|"Symbols_For_Legacy_Computing_Sup"->`Symbols_For_Legacy_Computing_Sup|"Syriac"->`Syriac|"Syriac_Sup"->`Syriac_Sup|"Tagalog"->`Tagalog|"Tagbanwa"->`Tagbanwa|"Tags"->`Tags|"Tai_Le"->`Tai_Le|"Tai_Tham"->`Tai_Tham|"Tai_Viet"->`Tai_Viet|"Tai_Xuan_Jing"->`Tai_Xuan_Jing|"Takri"->`Takri|"Tamil"->`Tamil|"Tamil_Sup"->`Tamil_Sup|"Tangsa"->`Tangsa|"Tangut"->`Tangut|"Tangut_Components"->`Tangut_Components|"Tangut_Sup"->`Tangut_Sup|"Telugu"->`Telugu|"Thaana"->`Thaana|"Thai"->`Thai|"Tibetan"->`Tibetan|"Tifinagh"->`Tifinagh|"Tirhuta"->`Tirhuta|"Todhri"->`Todhri|"Toto"->`Toto|"Transport_And_Map"->`Transport_And_Map|"Tulu_Tigalari"->`Tulu_Tigalari|"UCAS"->`UCAS|"UCAS_Ext"->`UCAS_Ext|"UCAS_Ext_A"->`UCAS_Ext_A|"Ugaritic"->`Ugaritic|"VS"->`VS|"VS_Sup"->`VS_Sup|"Vai"->`Vai|"Vedic_Ext"->`Vedic_Ext|"Vertical_Forms"->`Vertical_Forms|"Vithkuqi"->`Vithkuqi|"Wancho"->`Wancho|"Warang_Citi"->`Warang_Citi|"Yezidi"->`Yezidi|"Yi_Radicals"->`Yi_Radicals|"Yi_Syllables"->`Yi_Syllables|"Yijing"->`Yijing|"Zanabazar_Square"->`Zanabazar_Square|"Znamenny_Music"->`Znamenny_Music|v->err(err_att_valv)endleti_boolv=Bool_vbeginmatchvwith|"Y"->true|"N"->false|v->err(err_att_valv)endleti_bool_maybev=Bool_maybe_vbeginmatchvwith|"Y"->`True|"N"->`False|"M"->`Maybe|v->err(err_att_valv)endleti_cpv=Cp_v(cp_of_stringv)leti_cp_mapv=ifv="#"thenCp_map_v`SelfelseCp_map_v(`Cp(cp_of_stringv))leti_cp_optv=ifv=""thenCp_opt_vNoneelseCp_opt_v(Some(cp_of_stringv))leti_cps?emptyv=Cps_v(cps_of_string?emptyv)leti_cps_map?emptyv=ifv="#"thenCps_map_v`SelfelseCps_map_v(`Cps(cps_of_string?emptyv))leti_decomposition_typev=Decomposition_type_vbeginmatchvwith|"can"->`Can|"com"->`Com|"enc"->`Enc|"fin"->`Fin|"font"->`Font|"fra"->`Fra|"init"->`Init|"iso"->`Iso|"med"->`Med|"nar"->`Nar|"nb"->`Nb|"sml"->`Sml|"sqr"->`Sqr|"sub"->`Sub|"sup"->`Sup|"vert"->`Vert|"wide"->`Wide|"none"->`None|v->err(err_att_valv)endleti_east_asian_widthv=East_asian_width_vbeginmatchvwith|"A"->`A|"F"->`F|"H"->`H|"N"->`N|"Na"->`Na|"W"->`W|v->err(err_att_valv)endleti_general_categoryv=General_category_vbeginmatchvwith|"Lu"->`Lu|"Ll"->`Ll|"Lt"->`Lt|"Lm"->`Lm|"Lo"->`Lo|"Mn"->`Mn|"Mc"->`Mc|"Me"->`Me|"Nd"->`Nd|"Nl"->`Nl|"No"->`No|"Pc"->`Pc|"Pd"->`Pd|"Ps"->`Ps|"Pe"->`Pe|"Pi"->`Pi|"Pf"->`Pf|"Po"->`Po|"Sm"->`Sm|"Sc"->`Sc|"Sk"->`Sk|"So"->`So|"Zs"->`Zs|"Zl"->`Zl|"Zp"->`Zp|"Cc"->`Cc|"Cf"->`Cf|"Cs"->`Cs|"Co"->`Co|"Cn"->`Cn|v->err(err_att_valv)endleti_grapheme_cluster_breakv=Grapheme_cluster_break_vbeginmatchvwith|"CN"->`CN|"CR"->`CR|"EB"->`EB|"EBG"->`EBG|"EM"->`EM|"EX"->`EX|"GAZ"->`GAZ|"L"->`L|"LF"->`LF|"LV"->`LV|"LVT"->`LVT|"PP"->`PP|"RI"->`RI|"SM"->`SM|"T"->`T|"V"->`V|"XX"->`XX|"ZWJ"->`ZWJ|v->err(err_att_valv)endleti_hangul_syllable_typev=Hangul_syllable_type_vbeginmatchvwith|"L"->`L|"LV"->`LV|"LVT"->`LVT|"T"->`T|"V"->`V|"NA"->`NA|v->err(err_att_valv)endleti_intv=tryInt_v(int_of_stringv)withFailure_->err(err_att_valv)leti_indic_conjunct_breakv=Indic_conjunct_break_vbeginmatchvwith|"Consonant"->`Consonant|"Extend"->`Extend|"Linker"->`Linker|"None"->`None|v->err(err_att_valv)endleti_indic_syllabic_categoryv=Indic_syllabic_category_vbeginmatchvwith|"Avagraha"->`Avagraha|"Bindu"->`Bindu|"Brahmi_Joining_Number"->`Brahmi_Joining_Number|"Cantillation_Mark"->`Cantillation_Mark|"Consonant"->`Consonant|"Consonant_Dead"->`Consonant_Dead|"Consonant_Final"->`Consonant_Final|"Consonant_Head_Letter"->`Consonant_Head_Letter|"Consonant_Initial_Postfixed"->`Consonant_Initial_Postfixed|"Consonant_Killer"->`Consonant_Killer|"Consonant_Medial"->`Consonant_Medial|"Consonant_Placeholder"->`Consonant_Placeholder|"Consonant_Preceding_Repha"->`Consonant_Preceding_Repha|"Consonant_Prefixed"->`Consonant_Prefixed|"Consonant_Repha"->`Consonant_Repha|"Consonant_Subjoined"->`Consonant_Subjoined|"Consonant_Succeeding_Repha"->`Consonant_Succeeding_Repha|"Consonant_With_Stacker"->`Consonant_With_Stacker|"Gemination_Mark"->`Gemination_Mark|"Invisible_Stacker"->`Invisible_Stacker|"Joiner"->`Joiner|"Modifying_Letter"->`Modifying_Letter|"Non_Joiner"->`Non_Joiner|"Nukta"->`Nukta|"Number"->`Number|"Number_Joiner"->`Number_Joiner|"Other"->`Other|"Pure_Killer"->`Pure_Killer|"Reordering_Killer"->`Reordering_Killer|"Register_Shifter"->`Register_Shifter|"Syllable_Modifier"->`Syllable_Modifier|"Tone_Letter"->`Tone_Letter|"Tone_Mark"->`Tone_Mark|"Virama"->`Virama|"Visarga"->`Visarga|"Vowel"->`Vowel|"Vowel_Dependent"->`Vowel_Dependent|"Vowel_Independent"->`Vowel_Independent|v->err(err_att_valv)endleti_indic_matra_categoryv=Indic_matra_category_vbeginmatchvwith|"Right"->`Right|"Left"->`Left|"Visual_Order_Left"->`Visual_Order_Left|"Left_And_Right"->`Left_And_Right|"Top"->`Top|"Bottom"->`Bottom|"Top_And_Bottom"->`Top_And_Bottom|"Top_And_Right"->`Top_And_Right|"Top_And_Left"->`Top_And_Left|"Top_And_Left_And_Right"->`Top_And_Left_And_Right|"Bottom_And_Right"->`Bottom_And_Right|"Top_And_Bottom_And_Right"->`Top_And_Bottom_And_Right|"Overstruck"->`Overstruck|"Invisible"->`Invisible|"NA"->`NA|v->err(err_att_valv)endleti_indic_positional_categoryv=Indic_positional_category_vbeginmatchvwith|"Bottom"->`Bottom|"Bottom_And_Left"->`Bottom_And_Right|"Bottom_And_Right"->`Bottom_And_Right|"Left"->`Left|"Left_And_Right"->`Left_And_Right|"NA"->`NA|"Overstruck"->`Overstruck|"Right"->`Right|"Top"->`Top|"Top_And_Bottom"->`Top_And_Bottom|"Top_And_Bottom_And_Left"->`Top_And_Bottom_And_Left|"Top_And_Bottom_And_Right"->`Top_And_Bottom_And_Right|"Top_And_Left"->`Top_And_Left|"Top_And_Left_And_Right"->`Top_And_Left_And_Right|"Top_And_Right"->`Top_And_Right|"Visual_Order_Left"->`Visual_Order_Left|v->err(err_att_valv)endleti_joining_groupv=Joining_group_vbeginmatchvwith|"African_Feh"->`African_Feh|"African_Noon"->`African_Noon|"African_Qaf"->`African_Qaf|"Ain"->`Ain|"Alaph"->`Alaph|"Alef"->`Alef|"Alef_Maqsurah"->`Alef_Maqsurah|"Beh"->`Beh|"Beth"->`Beth|"Burushaski_Yeh_Barree"->`Burushaski_Yeh_Barree|"Dal"->`Dal|"Dalath_Rish"->`Dalath_Rish|"E"->`E|"Farsi_Yeh"->`Farsi_Yeh|"Fe"->`Fe|"Feh"->`Feh|"Final_Semkath"->`Final_Semkath|"Gaf"->`Gaf|"Gamal"->`Gamal|"Hah"->`Hah|"Hanifi_Rohingya_Kinna_Ya"->`Hanifi_Rohingya_Kinna_Ya|"Hanifi_Rohingya_Pa"->`Hanifi_Rohingya_Pa|"Hamza_On_Heh_Goal"->`Hamza_On_Heh_Goal|"He"->`He|"Heh"->`Heh|"Heh_Goal"->`Heh_Goal|"Heth"->`Heth|"Kaf"->`Kaf|"Kaph"->`Kaph|"Kashmiri_Yeh"->`Kashmiri_Yeh|"Khaph"->`Khaph|"Knotted_Heh"->`Knotted_Heh|"Lam"->`Lam|"Lamadh"->`Lamadh|"Malayalam_Bha"->`Malayalam_Bha|"Malayalam_Ja"->`Malayalam_Ja|"Malayalam_Lla"->`Malayalam_Lla|"Malayalam_Llla"->`Malayalam_Llla|"Malayalam_Nna"->`Malayalam_Nna|"Malayalam_Nnna"->`Malayalam_Nnna|"Malayalam_Nya"->`Malayalam_Nya|"Malayalam_Ra"->`Malayalam_Ra|"Malayalam_Ssa"->`Malayalam_Ssa|"Malayalam_Tta"->`Malayalam_Tta|"Malayalam_Nga"->`Malayalam_Nga|"Manichaean_Aleph"->`Manichaean_Aleph|"Manichaean_Ayin"->`Manichaean_Ayin|"Manichaean_Beth"->`Manichaean_Beth|"Manichaean_Daleth"->`Manichaean_Daleth|"Manichaean_Dhamedh"->`Manichaean_Dhamedh|"Manichaean_Five"->`Manichaean_Five|"Manichaean_Gimel"->`Manichaean_Gimel|"Manichaean_Heth"->`Manichaean_Heth|"Manichaean_Hundred"->`Manichaean_Hundred|"Manichaean_Kaph"->`Manichaean_Kaph|"Manichaean_Lamedh"->`Manichaean_Lamedh|"Manichaean_Mem"->`Manichaean_Mem|"Manichaean_Nun"->`Manichaean_Nun|"Manichaean_One"->`Manichaean_One|"Manichaean_Pe"->`Manichaean_Pe|"Manichaean_Qoph"->`Manichaean_Qoph|"Manichaean_Resh"->`Manichaean_Resh|"Manichaean_Sadhe"->`Manichaean_Sadhe|"Manichaean_Samekh"->`Manichaean_Samekh|"Manichaean_Taw"->`Manichaean_Taw|"Manichaean_Ten"->`Manichaean_Ten|"Manichaean_Teth"->`Manichaean_Teth|"Manichaean_Thamedh"->`Manichaean_Thamedh|"Manichaean_Twenty"->`Manichaean_Twenty|"Manichaean_Waw"->`Manichaean_Waw|"Manichaean_Yodh"->`Manichaean_Yodh|"Manichaean_Zayin"->`Manichaean_Zayin|"Meem"->`Meem|"Mim"->`Mim|"No_Joining_Group"->`No_Joining_Group|"Noon"->`Noon|"Nun"->`Nun|"Nya"->`Nya|"Pe"->`Pe|"Qaf"->`Qaf|"Qaph"->`Qaph|"Reh"->`Reh|"Reversed_Pe"->`Reversed_Pe|"Rohingya_Yeh"->`Rohingya_Yeh|"Sad"->`Sad|"Sadhe"->`Sadhe|"Seen"->`Seen|"Semkath"->`Semkath|"Shin"->`Shin|"Straight_Waw"->`Straight_Waw|"Swash_Kaf"->`Swash_Kaf|"Syriac_Waw"->`Syriac_Waw|"Tah"->`Tah|"Taw"->`Taw|"Teh_Marbuta"->`Teh_Marbuta|"Teh_Marbuta_Goal"->`Teh_Marbuta_Goal|"Teth"->`Teth|"Thin_Yeh"->`Thin_Yeh|"Vertical_Tail"->`Vertical_Tail|"Waw"->`Waw|"Yeh"->`Yeh|"Yeh_Barree"->`Yeh_Barree|"Yeh_With_Tail"->`Yeh_With_Tail|"Yudh"->`Yudh|"Yudh_He"->`Yudh_He|"Zain"->`Zain|"Zhain"->`Zhain|v->err(err_att_valv)endleti_joining_typev=Joining_type_vbeginmatchvwith|"U"->`U|"C"->`C|"T"->`T|"D"->`D|"L"->`L|"R"->`R|v->err(err_att_valv)endleti_line_breakv=Line_break_vbeginmatchvwith|"AI"->`AI|"AK"->`AK|"AL"->`AL|"AP"->`AP|"AS"->`AS|"B2"->`B2|"BA"->`BA|"BB"->`BB|"BK"->`BK|"CB"->`CB|"CJ"->`CJ|"CL"->`CL|"CM"->`CM|"CP"->`CP|"CR"->`CR|"EB"->`EB|"EM"->`EM|"EX"->`EX|"GL"->`GL|"H2"->`H2|"H3"->`H3|"HL"->`HL|"HY"->`HY|"ID"->`ID|"IN"->`IN|"IS"->`IS|"JL"->`JL|"JT"->`JT|"JV"->`JV|"LF"->`LF|"NL"->`NL|"NS"->`NS|"NU"->`NU|"OP"->`OP|"PO"->`PO|"PR"->`PR|"QU"->`QU|"RI"->`RI|"SA"->`SA|"SG"->`SG|"SP"->`SP|"SY"->`SY|"VF"->`VF|"VI"->`VI|"WJ"->`WJ|"XX"->`XX|"ZW"->`ZW|"ZWJ"->`ZWJ|v->err(err_att_valv)endleti_namev=Name_v(ifString.containsv'#'then`Patternvelse`Namev)leti_name_alias_type=function|"abbreviation"->`Abbreviation|"alternate"->`Alternate|"control"->`Control|"correction"->`Correction|"figment"->`Figment|v->err(err_att_valv)leti_numeric_typev=Numeric_type_vbeginmatchvwith|"None"->`None|"De"->`De|"Di"->`Di|"Nu"->`Nu|v->err(err_att_valv)endleti_numeric_valuev=Numeric_value_vbegintrymatchString.trimvwith|"NaN"->`NaN|s->letbases=matchsplit_string(String.trims)'/'with|[num;denom]->`Frac(int_of_stringnum,int_of_stringdenom)|[num]->`Num(Int64.of_stringnum)|_->failwith""in`Nums(List.mapbase(split_strings' '))withFailure_->err(err_att_valv)endleti_scriptv=Script_vbeginmatchvwith|"Adlm"->`Adlm|"Aghb"->`Aghb|"Ahom"->`Ahom|"Arab"->`Arab|"Armi"->`Armi|"Armn"->`Armn|"Avst"->`Avst|"Bali"->`Bali|"Bamu"->`Bamu|"Bass"->`Bass|"Batk"->`Batk|"Beng"->`Beng|"Bhks"->`Bhks|"Bopo"->`Bopo|"Brah"->`Brah|"Brai"->`Brai|"Bugi"->`Bugi|"Buhd"->`Buhd|"Cakm"->`Cakm|"Cans"->`Cans|"Cari"->`Cari|"Cham"->`Cham|"Cher"->`Cher|"Chrs"->`Chrs|"Copt"->`Copt|"Cpmn"->`Cpmn|"Cprt"->`Cprt|"Cyrl"->`Cyrl|"Deva"->`Deva|"Diak"->`Diak|"Dogr"->`Dogr|"Dsrt"->`Dsrt|"Dupl"->`Dupl|"Egyp"->`Egyp|"Elba"->`Elba|"Elym"->`Elym|"Ethi"->`Ethi|"Gara"->`Gara|"Geor"->`Geor|"Glag"->`Glag|"Gong"->`Gong|"Gonm"->`Gonm|"Goth"->`Goth|"Gran"->`Gran|"Grek"->`Grek|"Gujr"->`Gujr|"Gukh"->`Gukh|"Guru"->`Guru|"Hang"->`Hang|"Hani"->`Hani|"Hano"->`Hano|"Hatr"->`Hatr|"Hebr"->`Hebr|"Hira"->`Hira|"Hluw"->`Hluw|"Hmng"->`Hmng|"Hmnp"->`Hmnp|"Hrkt"->`Hrkt|"Hung"->`Hung|"Ital"->`Ital|"Java"->`Java|"Kali"->`Kali|"Kana"->`Kana|"Kawi"->`Kawi|"Khar"->`Khar|"Khmr"->`Khmr|"Khoj"->`Khoj|"Knda"->`Knda|"Krai"->`Krai|"Kthi"->`Kthi|"Kits"->`Kits|"Lana"->`Lana|"Laoo"->`Laoo|"Latn"->`Latn|"Lepc"->`Lepc|"Limb"->`Limb|"Lina"->`Lina|"Linb"->`Linb|"Lisu"->`Lisu|"Lyci"->`Lyci|"Lydi"->`Lydi|"Mahj"->`Mahj|"Maka"->`Maka|"Mand"->`Mand|"Mani"->`Mani|"Marc"->`Marc|"Medf"->`Medf|"Mend"->`Mend|"Merc"->`Merc|"Mero"->`Mero|"Mlym"->`Mlym|"Modi"->`Modi|"Mong"->`Mong|"Mroo"->`Mroo|"Mtei"->`Mtei|"Mult"->`Mult|"Mymr"->`Mymr|"Nagm"->`Nagm|"Nand"->`Nand|"Narb"->`Narb|"Nbat"->`Nbat|"Newa"->`Newa|"Nkoo"->`Nkoo|"Nshu"->`Nshu|"Ogam"->`Ogam|"Olck"->`Olck|"Onao"->`Onao|"Orkh"->`Orkh|"Orya"->`Orya|"Osge"->`Osge|"Osma"->`Osma|"Ougr"->`Ougr|"Palm"->`Palm|"Pauc"->`Pauc|"Perm"->`Perm|"Phag"->`Phag|"Phli"->`Phli|"Phlp"->`Phlp|"Phnx"->`Phnx|"Plrd"->`Plrd|"Prti"->`Prti|"Qaai"->`Qaai|"Rjng"->`Rjng|"Rohg"->`Rohg|"Runr"->`Runr|"Samr"->`Samr|"Sarb"->`Sarb|"Saur"->`Saur|"Sgnw"->`Sgnw|"Shaw"->`Shaw|"Shrd"->`Shrd|"Sidd"->`Sidd|"Sind"->`Sind|"Sinh"->`Sinh|"Sogd"->`Sogd|"Sogo"->`Sogo|"Sora"->`Sora|"Soyo"->`Soyo|"Sund"->`Sund|"Sunu"->`Sunu|"Sylo"->`Sylo|"Syrc"->`Syrc|"Tagb"->`Tagb|"Takr"->`Takr|"Tale"->`Tale|"Talu"->`Talu|"Taml"->`Taml|"Tang"->`Tang|"Tavt"->`Tavt|"Telu"->`Telu|"Tfng"->`Tfng|"Tglg"->`Tglg|"Thaa"->`Thaa|"Thai"->`Thai|"Tibt"->`Tibt|"Tirh"->`Tirh|"Tnsa"->`Tnsa|"Todr"->`Todr|"Toto"->`Toto|"Tutg"->`Tutg|"Ugar"->`Ugar|"Vaii"->`Vaii|"Vith"->`Vith|"Wara"->`Wara|"Wcho"->`Wcho|"Xpeo"->`Xpeo|"Xsux"->`Xsux|"Yezi"->`Yezi|"Yiii"->`Yiii|"Zanb"->`Zanb|"Zinh"->`Zinh|"Zyyy"->`Zyyy|"Zzzz"->`Zzzz|v->err(err_att_valv)endleti_script_seqv=letscriptv=o_script(i_scriptv)inScript_extensions_v(List.mapscript(split_stringv' '))leti_sentence_breakv=Sentence_break_vbeginmatchvwith|"AT"->`AT|"CL"->`CL|"CR"->`CR|"EX"->`EX|"FO"->`FO|"LE"->`LE|"LF"->`LF|"LO"->`LO|"NU"->`NU|"SC"->`SC|"SE"->`SE|"SP"->`SP|"ST"->`ST|"UP"->`UP|"XX"->`XX|v->err(err_att_valv)endleti_stringv=String_vvleti_uax_42_elementv=UAX_42_element_vbeginmatchvwith|"reserved"->`Reserved|"noncharacter"->`Noncharacter|"surrogate"->`Surrogate|"char"->`Char|s->err(err_att_vals)endleti_vertical_orientationv=Vertical_orientation_vbeginmatchvwith|"U"->`U|"R"->`R|"Tu"->`Tu|"Tr"->`Tr|s->err(err_att_vals)endleti_word_breakv=Word_break_vbeginmatchvwith|"CR"->`CR|"DQ"->`DQ|"EB"->`EB|"EBG"->`EBG|"EM"->`EM|"EX"->`EX|"Extend"->`Extend|"FO"->`FO|"GAZ"->`GAZ|"HL"->`HL|"KA"->`KA|"LE"->`LE|"LF"->`LF|"MB"->`MB|"ML"->`ML|"MN"->`MN|"NL"->`NL|"NU"->`NU|"RI"->`RI|"SQ"->`SQ|"WSegSpace"->`WSegSpace|"XX"->`XX|"ZWJ"->`ZWJ|v->err(err_att_valv)endmodulePkey=structtypet=keyletcompare:key->key->int=compareendmodulePmap=Map.Make(Pkey)typeprops=valuePmap.ttype'aprop=key*(value->'a)(* property key and value projection. *)letfindprops(k,o)=trySome(o(Pmap.findkprops))withNot_found->Noneletunknown_propname=(Othername),o_string(* non hunihan properties *)letuax_42_element=UAX_42_element,o_uax_42_element(* artefact of Uucd *)letage=Age,o_ageletalphabetic=Alphabetic,o_boolletascii_hex_digit=Ascii_hex_digit,o_boolletbidi_class=Bidi_class,o_bidi_classletbidi_control=Bidi_control,o_boolletbidi_mirrored=Bidi_mirrored,o_boolletbidi_mirroring_glyph=Bidi_mirroring_glyph,o_cp_optletbidi_paired_bracket=Bidi_paired_bracket,o_cp_mapletbidi_paired_bracket_type=Bidi_paired_bracket_type,o_bidi_paired_bracket_typeletblock=Block,o_blockletcanonical_combining_class=Canonical_combining_class,o_intletcased=Cased,o_boolletcase_folding=Case_folding,o_cps_mapletcase_ignorable=Case_ignorable,o_boolletchanges_when_casefolded=Changes_when_casefolded,o_boolletchanges_when_casemapped=Changes_when_casemapped,o_boolletchanges_when_lowercased=Changes_when_lowercased,o_boolletchanges_when_nfkc_casefolded=Changes_when_nfkc_casefolded,o_boolletchanges_when_titlecased=Changes_when_titlecased,o_boolletchanges_when_uppercased=Changes_when_uppercased,o_boolletcomposition_exclusion=Composition_exclusion,o_boolletdash=Dash,o_boolletdecomposition_mapping=Decomposition_mapping,o_cps_mapletdecomposition_type=Decomposition_type,o_decomposition_typeletdefault_ignorable_code_point=Default_ignorable_code_point,o_boolletdeprecated=Deprecated,o_boolletdiacritic=Diacritic,o_boolleteast_asian_width=East_asian_width,o_east_asian_widthletemoji=Emoji,o_boolletemoji_presentation=Emoji_presentation,o_boolletemoji_modifier=Emoji_modifier,o_boolletemoji_modifier_base=Emoji_modifier_base,o_boolletemoji_component=Emoji_component,o_boolletequivalent_unified_ideograph=Equivalent_unified_ideograph,o_cp_optletextended_pictographic=Extended_pictographic,o_boolletexpands_on_nfc=Expands_on_nfc,o_boolletexpands_on_nfd=Expands_on_nfd,o_boolletexpands_on_nfkc=Expands_on_nfkc,o_boolletexpands_on_nfkd=Expands_on_nfkd,o_boolletextender=Extender,o_boolletfc_nfkc_closure=Fc_nfkc_closure,o_cps_mapletfull_composition_exclusion=Full_composition_exclusion,o_boolletgeneral_category=General_category,o_general_categoryletgrapheme_base=Grapheme_base,o_boolletgrapheme_cluster_break=Grapheme_cluster_break,o_grapheme_cluster_breakletgrapheme_extend=Grapheme_extend,o_boolletgrapheme_link=Grapheme_link,o_boollethangul_syllable_type=Hangul_syllable_type,o_hangul_syllable_typelethex_digit=Hex_digit,o_boollethyphen=Hyphen,o_boolletid_continue=Id_continue,o_boolletid_compat_math_continue=Id_compat_math_continue,o_boolletid_compat_math_start=Id_compat_math_start,o_boolletid_start=Id_start,o_boolletideographic=Ideographic,o_boolletids_binary_operator=Ids_binary_operator,o_boolletids_trinary_operator=Ids_trinary_operator,o_boolletids_unary_operator=Ids_unary_operator,o_boolletindic_conjunct_break=Indic_conjunct_break,o_indic_conjunct_breakletindic_syllabic_category=Indic_syllabic_category,o_indic_syllabic_categoryletindic_matra_category=Indic_matra_category,o_indic_matra_categoryletindic_positional_category=Indic_positional_category,o_indic_positional_categoryletiso_comment=Iso_comment,o_stringletjamo_short_name=Jamo_short_name,o_stringletjoin_control=Join_control,o_boolletjoining_group=Joining_group,o_joining_groupletjoining_type=Joining_type,o_joining_typeletline_break=Line_break,o_line_breakletlogical_order_exception=Logical_order_exception,o_boolletlowercase=Lowercase,o_boolletlowercase_mapping=Lowercase_mapping,o_cps_mapletmath=Math,o_boolletmodifier_combining_mark=Modifier_combining_mark,o_boolletname=Name,o_nameletname_alias=Name_alias,o_name_aliasletnfc_quick_check=Nfc_quick_check,o_bool_maybeletnfd_quick_check=Nfd_quick_check,o_bool_maybeletnfkc_quick_check=Nfkc_quick_check,o_bool_maybeletnfkc_casefold=Nfkc_casefold,o_cps_mapletnfkc_simple_casefold=Nfkc_simple_casefold,o_cps_mapletnfkd_quick_check=Nfkd_quick_check,o_bool_maybeletnoncharacter_code_point=Noncharacter_code_point,o_boolletnumeric_type=Numeric_type,o_numeric_typeletnumeric_value=Numeric_value,o_numeric_valueletother_alphabetic=Other_alphabetic,o_boolletother_default_ignorable_code_point=Other_default_ignorable_code_point,o_boolletother_grapheme_extend=Other_grapheme_extend,o_boolletother_id_continue=Other_id_continue,o_boolletother_id_start=Other_id_start,o_boolletother_lowercase=Other_lowercase,o_boolletother_math=Other_math,o_boolletother_uppercase=Other_uppercase,o_boolletpattern_syntax=Pattern_syntax,o_boolletpattern_white_space=Pattern_white_space,o_boolletprepended_concatenation_mark=Prepended_concatenation_mark,o_boolletquotation_mark=Quotation_mark,o_boolletradical=Radical,o_boolletregional_indicator=Regional_indicator,o_boolletscript=Script,o_scriptletscript_extensions=Script_extensions,o_script_extensionsletsentence_break=Sentence_break,o_sentence_breakletsimple_case_folding=Simple_case_folding,o_cp_mapletsimple_lowercase_mapping=Simple_lowercase_mapping,o_cp_mapletsimple_titlecase_mapping=Simple_titlecase_mapping,o_cp_mapletsimple_uppercase_mapping=Simple_uppercase_mapping,o_cp_mapletsoft_dotted=Soft_dotted,o_boolletsterm=Sterm,o_boolletterminal_punctuation=Terminal_punctuation,o_boollettitlecase_mapping=Titlecase_mapping,o_cps_mapletunicode_1_name=Unicode_1_name,o_stringletunified_ideograph=Unified_ideograph,o_boolletuppercase=Uppercase,o_boolletuppercase_mapping=Uppercase_mapping,o_cps_mapletvariation_selector=Variation_selector,o_boolletvertical_orientation=Vertical_orientation,o_vertical_orientationletwhite_space=White_space,o_boolletword_break=Word_break,o_word_breakletxid_continue=Xid_continue,o_boolletxid_start=Xid_start,o_bool(* unihan properties *)letkAccountingNumeric=KAccountingNumeric,o_stringletkAlternateHanYu=KAlternateHanYu,o_stringletkAlternateJEF=KAlternateJEF,o_stringletkAlternateKangXi=KAlternateKangXi,o_stringletkAlternateMorohashi=KAlternateMorohashi,o_stringletkAlternateTotalStrokes=KAlternateTotalStrokes,o_stringletkBigFive=KBigFive,o_stringletkCCCII=KCCCII,o_stringletkCNS1986=KCNS1986,o_stringletkCNS1992=KCNS1992,o_stringletkCangjie=KCangjie,o_stringletkCantonese=KCantonese,o_stringletkCheungBauer=KCheungBauer,o_stringletkCheungBauerIndex=KCheungBauerIndex,o_stringletkCihaiT=KCihaiT,o_stringletkCompatibilityVariant=KCompatibilityVariant,o_stringletkCowles=KCowles,o_stringletkDaeJaweon=KDaeJaweon,o_stringletkDefinition=KDefinition,o_stringletkEACC=KEACC,o_stringletkFanqie=KFanqie,o_stringletkFenn=KFenn,o_stringletkFennIndex=KFennIndex,o_stringletkFourCornerCode=KFourCornerCode,o_stringletkFrequency=KFrequency,o_stringletkGB0=KGB0,o_stringletkGB1=KGB1,o_stringletkGB3=KGB3,o_stringletkGB5=KGB5,o_stringletkGB7=KGB7,o_stringletkGB8=KGB8,o_stringletkGSR=KGSR,o_stringletkGradeLevel=KGradeLevel,o_stringletkHDZRadBreak=KHDZRadBreak,o_stringletkHKGlyph=KHKGlyph,o_stringletkHKSCS=KHKSCS,o_stringletkHanYu=KHanYu,o_stringletkHangul=KHangul,o_stringletkHanyuPinlu=KHanyuPinlu,o_stringletkHanyuPinyin=KHanyuPinyin,o_stringletkIBMJapan=KIBMJapan,o_stringletkIICore=KIICore,o_stringletkIRGDaeJaweon=KIRGDaeJaweon,o_stringletkIRGDaiKanwaZiten=KIRGDaiKanwaZiten,o_stringletkIRGHanyuDaZidian=KIRGHanyuDaZidian,o_stringletkIRGKangXi=KIRGKangXi,o_stringletkIRG_GSource=KIRG_GSource,o_stringletkIRG_HSource=KIRG_HSource,o_stringletkIRG_JSource=KIRG_JSource,o_stringletkIRG_KPSource=KIRG_KPSource,o_stringletkIRG_KSource=KIRG_KSource,o_stringletkIRG_MSource=KIRG_MSource,o_stringletkIRG_SSource=KIRG_SSource,o_stringletkIRG_TSource=KIRG_TSource,o_stringletkIRG_USource=KIRG_USource,o_stringletkIRG_UKSource=KIRG_UKSource,o_stringletkIRG_VSource=KIRG_VSource,o_stringletkJHJ=KJHJ,o_stringletkJIS0213=KJIS0213,o_stringletkJa=KJa,o_stringletkJapanese=KJapanese,o_stringletkJapaneseKun=KJapaneseKun,o_stringletkJapaneseOn=KJapaneseOn,o_stringletkJinmeiyoKanji=KJinmeiyoKanji,o_stringletkJis0=KJis0,o_stringletkJis1=KJis1,o_stringletkJoyoKanji=KJoyoKanji,o_stringletkKPS0=KKPS0,o_stringletkKPS1=KKPS1,o_stringletkKSC0=KKSC0,o_stringletkKSC1=KKSC1,o_stringletkKangXi=KKangXi,o_stringletkKarlgren=KKarlgren,o_stringletkKorean=KKorean,o_stringletkKoreanEducationHanja=KKoreanEducationHanja,o_stringletkKoreanName=KKoreanName,o_stringletkLau=KLau,o_stringletkMainlandTelegraph=KMainlandTelegraph,o_stringletkMandarin=KMandarin,o_stringletkMatthews=KMatthews,o_stringletkMeyerWempe=KMeyerWempe,o_stringletkMojiJoho=KMojiJoho,o_stringletkMorohashi=KMorohashi,o_stringletkNelson=KNelson,o_stringletkOtherNumeric=KOtherNumeric,o_stringletkPhonetic=KPhonetic,o_stringletkPrimaryNumeric=KPrimaryNumeric,o_stringletkPseudoGB1=KPseudoGB1,o_stringletkRSAdobe_Japan1_6=KRSAdobe_Japan1_6,o_stringletkRSJapanese=KRSJapanese,o_stringletkRSKanWa=KRSKanWa,o_stringletkRSKangXi=KRSKangXi,o_stringletkRSKorean=KRSKorean,o_stringletkRSMerged=KRSMerged,o_stringletkRSTUnicode=KRSTUnicode,o_stringletkRSUnicode=KRSUnicode,o_stringletkReading=KReading,o_stringletkSBGY=KSBGY,o_stringletkSemanticVariant=KSemanticVariant,o_stringletkSimplifiedVariant=KSimplifiedVariant,o_stringletkSMSZD2003Index=KSMSZD2003Index,o_stringletkSMSZD2003Readings=KSMSZD2003Readings,o_stringletkSpecializedSemanticVariant=KSpecializedSemanticVariant,o_stringletkSpoofingVariant=KSpoofingVariant,o_stringletkSrc_NushuDuben=KSrc_NushuDuben,o_stringletkStrange=KStrange,o_stringletkTGH=KTGH,o_stringletkTGHZ2013=KTGHZ2013,o_stringletkTGT_MergedSrc=KTGT_MergedSrc,o_stringletkTaiwanTelegraph=KTaiwanTelegraph,o_stringletkTang=KTang,o_stringletkTotalStrokes=KTotalStrokes,o_stringletkTraditionalVariant=KTraditionalVariant,o_stringletkUnihanCore2020=KUnihanCore2020,o_stringletkVietnamese=KVietnamese,o_stringletkVietnameseNumeric=KVietnameseNumeric,o_stringletkWubi=KWubi,o_stringletkXHC1983=KXHC1983,o_stringletkXerox=KXerox,o_stringletkZhuang=KZhuang,o_stringletkZhuangNumeric=KZhuangNumeric,o_stringletkZVariant=KZVariant,o_string(* Unicode Character Databases *)typeblock=(cp*cp)*stringtypenamed_sequence=string*cplisttypenormalization_correction=cp*cplist*cplist*(int*int*int)typestandardized_variant=cplist*string*[`Isolate|`Initial|`Medial|`Final]listtypecjk_radical=string*cp*cptypeemoji_source=cplist*intoption*intoption*intoptiontypedo_not_emit={instead_of:cplist;use:cplist;because:string;}typet={description:string;repertoire:propsCpmap.t;blocks:blocklist;named_sequences:named_sequencelist;provisional_named_sequences:named_sequencelist;normalization_corrections:normalization_correctionlist;standardized_variants:standardized_variantlist;cjk_radicals:cjk_radicallist;emoji_sources:emoji_sourcelist;do_not_emit:do_not_emitlist;}letcp_propsdbcp=trySome(Cpmap.findcpdb.repertoire)withNot_found->Noneletcp_propdbcpp=tryfind(Cpmap.findcpdb.repertoire)pwithNot_found->None(* Decode *)(* Xml names *)letns_ucd="http://www.unicode.org/ns/2003/ucd/1.0"letn_block=(ns_ucd,"block")letn_blocks=(ns_ucd,"blocks")letn_char=(ns_ucd,"char")letn_cjk_radical=(ns_ucd,"cjk-radical")letn_cjk_radicals=(ns_ucd,"cjk-radicals")letn_do_not_emit=(ns_ucd,"do-not-emit")letn_description=(ns_ucd,"description")letn_emoji_source=(ns_ucd,"emoji-source")letn_emoji_sources=(ns_ucd,"emoji-sources")letn_group=(ns_ucd,"group")letn_instead=(ns_ucd,"instead")letn_name_alias=(ns_ucd,"name-alias")letn_named_sequence=(ns_ucd,"named-sequence")letn_named_sequences=(ns_ucd,"named-sequences")letn_noncharacter=(ns_ucd,"noncharacter")letn_normalization_correction=(ns_ucd,"normalization-correction")letn_normalization_corrections=(ns_ucd,"normalization-corrections")letn_provisional_named_sequences=(ns_ucd,"provisional-named-sequences")letn_repertoire=(ns_ucd,"repertoire")letn_reserved=(ns_ucd,"reserved")letn_standardized_variant=(ns_ucd,"standardized-variant")letn_standardized_variants=(ns_ucd,"standardized-variants")letn_surrogate=(ns_ucd,"surrogate")letn_ucd=(ns_ucd,"ucd")(* Attribute parsing *)letadd_prop:valuePmap.t->Xmlm.attribute->valuePmap.t=leth=Hashtbl.create500inletmap=Hashtbl.addhinmap"AHex"(Ascii_hex_digit,i_bool);map"Alpha"(Alphabetic,i_bool);map"Bidi_C"(Bidi_control,i_bool);map"Bidi_M"(Bidi_mirrored,i_bool);map"Cased"(Cased,i_bool);map"CI"(Case_ignorable,i_bool);map"CE"(Composition_exclusion,i_bool);map"CWCF"(Changes_when_casefolded,i_bool);map"CWCM"(Changes_when_casemapped,i_bool);map"CWL"(Changes_when_lowercased,i_bool);map"CWKCF"(Changes_when_nfkc_casefolded,i_bool);map"CWT"(Changes_when_titlecased,i_bool);map"CWU"(Changes_when_uppercased,i_bool);map"Comp_Ex"(Full_composition_exclusion,i_bool);map"DI"(Default_ignorable_code_point,i_bool);map"Dash"(Dash,i_bool);map"Dep"(Deprecated,i_bool);map"Dia"(Diacritic,i_bool);map"EqUIdeo"(Equivalent_unified_ideograph,i_cp_opt);map"Ext"(Extender,i_bool);map"FC_NFKC"(Fc_nfkc_closure,i_cps_map~empty:false);map"GCB"(Grapheme_cluster_break,i_grapheme_cluster_break);map"Gr_Base"(Grapheme_base,i_bool);map"Gr_Ext"(Grapheme_extend,i_bool);map"Gr_Link"(Grapheme_link,i_bool);map"Hex"(Hex_digit,i_bool);map"Hyphen"(Hyphen,i_bool);map"ID_Compat_Math_Continue"(Id_compat_math_continue,i_bool);map"ID_Compat_Math_Start"(Id_compat_math_start,i_bool);map"IDC"(Id_continue,i_bool);map"IDS"(Id_start,i_bool);map"IDSB"(Ids_binary_operator,i_bool);map"IDST"(Ids_trinary_operator,i_bool);map"IDSU"(Ids_unary_operator,i_bool);map"Ideo"(Ideographic,i_bool);map"InCB"(Indic_conjunct_break,i_indic_conjunct_break);map"InSC"(Indic_syllabic_category,i_indic_syllabic_category);map"InMC"(Indic_matra_category,i_indic_matra_category);map"InPC"(Indic_positional_category,i_indic_positional_category);map"JSN"(Jamo_short_name,i_string);map"Join_C"(Join_control,i_bool);map"LOE"(Logical_order_exception,i_bool);map"Lower"(Lowercase,i_bool);map"Math"(Math,i_bool);map"MCM"(Modifier_combining_mark,i_bool);map"NChar"(Noncharacter_code_point,i_bool);map"NFC_QC"(Nfc_quick_check,i_bool_maybe);map"NFD_QC"(Nfd_quick_check,i_bool_maybe);map"NFKC_QC"(Nfkc_quick_check,i_bool_maybe);map"NFKC_CF"(Nfkc_casefold,i_cps_map~empty:true);map"NFKC_SCF"(Nfkc_simple_casefold,i_cps_map~empty:true);map"NFKD_QC"(Nfkd_quick_check,i_bool_maybe);map"OAlpha"(Other_alphabetic,i_bool);map"ODI"(Other_default_ignorable_code_point,i_bool);map"OGr_Ext"(Other_grapheme_extend,i_bool);map"OIDC"(Other_id_continue,i_bool);map"OIDS"(Other_id_start,i_bool);map"OLower"(Other_lowercase,i_bool);map"OMath"(Other_math,i_bool);map"OUpper"(Other_uppercase,i_bool);map"Pat_Syn"(Pattern_syntax,i_bool);map"Pat_WS"(Pattern_white_space,i_bool);map"PCM"(Prepended_concatenation_mark,i_bool);map"QMark"(Quotation_mark,i_bool);map"Radical"(Radical,i_bool);map"RI"(Regional_indicator,i_bool);map"SB"(Sentence_break,i_sentence_break);map"SD"(Soft_dotted,i_bool);map"STerm"(Sterm,i_bool);map"Term"(Terminal_punctuation,i_bool);map"UIdeo"(Unified_ideograph,i_bool);map"Upper"(Uppercase,i_bool);map"VS"(Variation_selector,i_bool);map"vo"(Vertical_orientation,i_vertical_orientation);map"WB"(Word_break,i_word_break);map"WSpace"(White_space,i_bool);map"XIDC"(Xid_continue,i_bool);map"XIDS"(Xid_start,i_bool);map"XO_NFC"(Expands_on_nfc,i_bool);map"XO_NFD"(Expands_on_nfd,i_bool);map"XO_NFKC"(Expands_on_nfkc,i_bool);map"XO_NFKD"(Expands_on_nfkd,i_bool);map"age"(Age,i_age);map"bc"(Bidi_class,i_bidi_class);map"blk"(Block,i_block);map"bmg"(Bidi_mirroring_glyph,i_cp_opt);map"bpb"(Bidi_paired_bracket,i_cp_map);map"bpt"(Bidi_paired_bracket_type,i_bidi_paired_bracket_type);map"ccc"(Canonical_combining_class,i_int);map"cf"(Case_folding,i_cps_map~empty:false);map"dm"(Decomposition_mapping,(i_cps_map~empty:true));map"dt"(Decomposition_type,i_decomposition_type);map"ea"(East_asian_width,i_east_asian_width);map"Emoji"(Emoji,i_bool);map"EPres"(Emoji_presentation,i_bool);map"EMod"(Emoji_modifier,i_bool);map"EBase"(Emoji_modifier_base,i_bool);map"EComp"(Emoji_component,i_bool);map"ExtPict"(Extended_pictographic,i_bool);map"gc"(General_category,i_general_category);map"hst"(Hangul_syllable_type,i_hangul_syllable_type);map"isc"(Iso_comment,i_string);map"jg"(Joining_group,i_joining_group);map"jt"(Joining_type,i_joining_type);map"lb"(Line_break,i_line_break);map"lc"(Lowercase_mapping,i_cps_map~empty:false);map"na"(Name,i_name);map"na1"(Unicode_1_name,i_string);map"nt"(Numeric_type,i_numeric_type);map"nv"(Numeric_value,i_numeric_value);map"sc"(Script,i_script);map"scf"(Simple_case_folding,i_cp_map);map"scx"(Script_extensions,i_script_seq);map"slc"(Simple_lowercase_mapping,i_cp_map);map"stc"(Simple_titlecase_mapping,i_cp_map);map"suc"(Simple_uppercase_mapping,i_cp_map);map"tc"(Titlecase_mapping,i_cps_map~empty:false);map"uax_42_element"(UAX_42_element,i_uax_42_element);(* artefact *)map"uc"(Uppercase_mapping,i_cps_map~empty:false);map"kAccountingNumeric"(KAccountingNumeric,i_string);map"kAlternateHanYu"(KAlternateHanYu,i_string);map"kAlternateJEF"(KAlternateJEF,i_string);map"kAlternateKangXi"(KAlternateKangXi,i_string);map"kAlternateMorohashi"(KAlternateMorohashi,i_string);map"kBigFive"(KBigFive,i_string);map"kCCCII"(KCCCII,i_string);map"kCNS1986"(KCNS1986,i_string);map"kCNS1992"(KCNS1992,i_string);map"kCangjie"(KCangjie,i_string);map"kCantonese"(KCantonese,i_string);map"kCheungBauer"(KCheungBauer,i_string);map"kCheungBauerIndex"(KCheungBauerIndex,i_string);map"kCihaiT"(KCihaiT,i_string);map"kCompatibilityVariant"(KCompatibilityVariant,i_string);map"kCowles"(KCowles,i_string);map"kDaeJaweon"(KDaeJaweon,i_string);map"kDefinition"(KDefinition,i_string);map"kEACC"(KEACC,i_string);map"kFanqie"(KFanqie,i_string);map"kFenn"(KFenn,i_string);map"kFennIndex"(KFennIndex,i_string);map"kFourCornerCode"(KFourCornerCode,i_string);map"kFrequency"(KFrequency,i_string);map"kGB0"(KGB0,i_string);map"kGB1"(KGB1,i_string);map"kGB3"(KGB3,i_string);map"kGB5"(KGB5,i_string);map"kGB7"(KGB7,i_string);map"kGB8"(KGB8,i_string);map"kGSR"(KGSR,i_string);map"kGradeLevel"(KGradeLevel,i_string);map"kHDZRadBreak"(KHDZRadBreak,i_string);map"kHKGlyph"(KHKGlyph,i_string);map"kHKSCS"(KHKSCS,i_string);map"kHanYu"(KHanYu,i_string);map"kHangul"(KHangul,i_string);map"kHanyuPinlu"(KHanyuPinlu,i_string);map"kHanyuPinyin"(KHanyuPinyin,i_string);map"kIBMJapan"(KIBMJapan,i_string);map"kIICore"(KIICore,i_string);map"kIRGDaeJaweon"(KIRGDaeJaweon,i_string);map"kIRGDaiKanwaZiten"(KIRGDaiKanwaZiten,i_string);map"kIRGHanyuDaZidian"(KIRGHanyuDaZidian,i_string);map"kIRGKangXi"(KIRGKangXi,i_string);map"kIRG_GSource"(KIRG_GSource,i_string);map"kIRG_HSource"(KIRG_HSource,i_string);map"kIRG_JSource"(KIRG_JSource,i_string);map"kIRG_KPSource"(KIRG_KPSource,i_string);map"kIRG_KSource"(KIRG_KSource,i_string);map"kIRG_MSource"(KIRG_MSource,i_string);map"kIRG_SSource"(KIRG_SSource,i_string);map"kIRG_TSource"(KIRG_TSource,i_string);map"kIRG_USource"(KIRG_USource,i_string);map"kIRG_UKSource"(KIRG_UKSource,i_string);map"kIRG_VSource"(KIRG_VSource,i_string);map"kJapanese"(KJapanese,i_string);map"kJHJ"(KJHJ,i_string);map"kJIS0213"(KJIS0213,i_string);map"kJa"(KJa,i_string);map"kJapaneseKun"(KJapaneseKun,i_string);map"kJapaneseOn"(KJapaneseOn,i_string);map"kJinmeiyoKanji"(KJinmeiyoKanji,i_string);map"kJis0"(KJis0,i_string);map"kJis1"(KJis1,i_string);map"kJoyoKanji"(KJoyoKanji,i_string);map"kKPS0"(KKPS0,i_string);map"kKPS1"(KKPS1,i_string);map"kKSC0"(KKSC0,i_string);map"kKSC1"(KKSC1,i_string);map"kKangXi"(KKangXi,i_string);map"kKarlgren"(KKarlgren,i_string);map"kKorean"(KKorean,i_string);map"kKoreanEducationHanja"(KKoreanEducationHanja,i_string);map"kKoreanName"(KKoreanName,i_string);map"kLau"(KLau,i_string);map"kMainlandTelegraph"(KMainlandTelegraph,i_string);map"kMandarin"(KMandarin,i_string);map"kMatthews"(KMatthews,i_string);map"kMeyerWempe"(KMeyerWempe,i_string);map"kMorohashi"(KMorohashi,i_string);map"kNelson"(KNelson,i_string);map"kOtherNumeric"(KOtherNumeric,i_string);map"kPhonetic"(KPhonetic,i_string);map"kPrimaryNumeric"(KPrimaryNumeric,i_string);map"kPseudoGB1"(KPseudoGB1,i_string);map"kRSAdobe_Japan1_6"(KRSAdobe_Japan1_6,i_string);map"kRSJapanese"(KRSJapanese,i_string);map"kRSKanWa"(KRSKanWa,i_string);map"kRSKangXi"(KRSKangXi,i_string);map"kRSKorean"(KRSKorean,i_string);map"kRSMerged"(KRSMerged,i_string);map"kRSTUnicode"(KRSTUnicode,i_string);map"kRSUnicode"(KRSUnicode,i_string);map"kReading"(KReading,i_string);map"kSBGY"(KSBGY,i_string);map"kSemanticVariant"(KSemanticVariant,i_string);map"kSimplifiedVariant"(KSimplifiedVariant,i_string);map"kSMSZD2003Index"(KSMSZD2003Index,i_string);map"kSMSZD2003Readings"(KSMSZD2003Readings,i_string);map"kSpecializedSemanticVariant"(KSpecializedSemanticVariant,i_string);map"kSpoofingVariant"(KSpoofingVariant,i_string);map"kSrc_NushuDuben"(KSrc_NushuDuben,i_string);map"kTGH"(KTGH,i_string);map"kTGHZ2013"(KTGHZ2013,i_string);map"kTGT_MergedSrc"(KTGT_MergedSrc,i_string);map"kTaiwanTelegraph"(KTaiwanTelegraph,i_string);map"kTang"(KTang,i_string);map"kTotalStrokes"(KTotalStrokes,i_string);map"kTraditionalVariant"(KTraditionalVariant,i_string);map"kVietnamese"(KVietnamese,i_string);map"kVietnameseNumeric"(KVietnameseNumeric,i_string);map"kWubi"(KWubi,i_string);map"kXHC1983"(KXHC1983,i_string);map"kXerox"(KXerox,i_string);map"kZhuang"(KZhuang,i_string);map"kZhuangNumeric"(KZhuangNumeric,i_string);map"kZVariant"(KZVariant,i_string);funm(n,v)->trymatchnwith|("",p)->letk,conv=Hashtbl.findhpinPmap.addk(convv)m|_->raiseNot_foundwithNot_found->Pmap.add(Othern)(i_stringv)mletattvnatts=(* value of attribute [n] in atts or raises. *)trysnd(List.find(fun(en,v)->en=("",n))atts)with|Not_found->err_miss_attnletrecskip_eld=(* skips an element, start signal was input. *)letrecloopddepth=matchXmlm.inputdwith|`El_start_->loopd(depth+1)|`El_end->ifdepth=0then()elseloopd(depth-1)|s->loopddepthinloopd0(* Parses a sequence of empty elements named n and a El_end. *)letp_seqnp_attsd=letrecauxnp_attsdacc=matchXmlm.inputdwith|`El_start(n',atts)whenn'=n->ifXmlm.inputd<>`El_endthenerrerr_exp_el_endelseauxnp_attsd((p_attsatts)::acc);|`El_start_->skip_eld;auxnp_attsdacc|`El_end->List.revacc|`Data_->errerr_data|_->assertfalseinauxnp_attsd[]letp_descriptiond=match(Xmlm.inputd)with|`Datadesc->if(Xmlm.inputd<>`El_end)thenerrerr_exp_el_endelsedesc|`El_end->""|_->errerr_exp_dataletp_name_aliasesd=letrecloopddepthacc=matchXmlm.peekdwith|`El_start(n,atts)whenn=n_name_alias->ignore(Xmlm.inputd);letalias=ref""inletatype=refNoneinletp_alias_atts=function|("","alias"),v->alias:=v|("","type"),v->atype:=Some(i_name_alias_typev)|_->()inList.iterp_alias_attsatts;beginmatch!atypewithNone->errerr_invalid_name_alias_spec|Somet->loopd(depth+1)((!alias,t)::acc)end|`El_start(n,atts)->ignore(Xmlm.inputd);skip_eld;loopddepthacc|`El_end->ifdepth=0thenList.revaccelse(ignore(Xmlm.inputd);loopd(depth-1)acc)|`Data_->errerr_data|_->assertfalseinloopd0[]letp_cpdrepattsg_props=letcp=refNoneinletcp_first=refNoneinletcp_last=refNoneinletaddacc((n,v)asa)=matchnwith|("","cp")->cp:=Some(cp_of_stringv);acc|("","first-cp")->cp_first:=Some(cp_of_stringv);acc|("","last-cp")->cp_last:=Some(cp_of_stringv);acc|_->add_propaccainletprops=List.fold_leftaddg_propsattsinletprops=Pmap.addName_alias(Name_alias_v(p_name_aliasesd))propsinmatch!cpwith|Somecp->Cpmap.addcppropsrep|None->match!cp_first,!cp_lastwith|Somef,Somel->letrep=refrepinforcp=ftoldorep:=Cpmap.addcpprops!repdone;!rep|_->errerr_invalid_cp_specletp_repertoired=leteattt=("","uax_42_element"),tin(* fake attribute for uniformity *)letrecloopddepthrepg_atts=matchXmlm.inputdwith|`El_start(n,atts)whenn=n_reserved->loopd(depth+1)(p_cpdrep(eatt"reserved"::atts)g_atts)g_atts|`El_start(n,atts)whenn=n_noncharacter->loopd(depth+1)(p_cpdrep(eatt"noncharacter"::atts)g_atts)g_atts|`El_start(n,atts)whenn=n_surrogate->loopd(depth+1)(p_cpdrep(eatt"surrogate"::atts)g_atts)g_atts|`El_start(n,atts)whenn=n_char->loopd(depth+1)(p_cpdrep(eatt"char"::atts)g_atts)g_atts|`El_start(n,atts)whenn=n_group->letatts=List.fold_leftadd_propPmap.emptyattsinletrep=loopd0repattsin(* ^ empty: no group hierarchy *)loopddepthrepPmap.empty|`El_start(n,atts)->skip_eld;loopddepthrepg_atts(* skip foreign *)|`El_end->ifdepth=0thenrepelseloopd(depth-1)repg_atts|`Data_->errerr_data|_->assertfalseinloopd0Cpmap.emptyPmap.emptyletp_blocksd=letb_attsatts=(cp_of_string(attv"first-cp"atts),cp_of_string(attv"last-cp"atts)),attv"name"attsinp_seqn_blockb_attsdletp_named_sequencesd=letns_attsatts=attv"name"atts,cps_of_string(attv"cps"atts)inp_seqn_named_sequencens_attsdletp_normalization_correctionsd=letversion_of_stringv=trymatchList.mapint_of_string(split_stringv'.')with|[v1;v2;v3;]->(v1,v2,v3)|_->failwith""withFailure_->err(err_att_valv)inletnc_attsatts=cp_of_string(attv"cp"atts),cps_of_string(attv"old"atts),cps_of_string(attv"new"atts),version_of_string(attv"version"atts)inp_seqn_normalization_correctionnc_attsdletp_standardized_variantsd=letwhen_of_stringv=letws=matchswith|"isolate"->`Isolate|"initial"->`Initial|"medial"->`Medial|"final"->`Final|s->err(err_att_vals)inList.mapw(split_stringv' ')inletsv_attsatts=cps_of_string(attv"cps"atts),attv"desc"atts,when_of_string(attv"when"atts)inp_seqn_standardized_variantsv_attsdletp_cjk_radicalsd=letcjk_r_attsatts=attv"number"atts,cp_of_string(attv"radical"atts),cp_of_string(attv"ideograph"atts)inp_seqn_cjk_radicalcjk_r_attsdletp_emoji_sourcesd=letes_attsatts=letopt_intv=ifv=""thenNoneelseSome(cp_of_stringv)incps_of_string(attv"unicode"atts),opt_int(attv"docomo"atts),opt_int(attv"kddi"atts),opt_int(attv"softbank"atts)inp_seqn_emoji_sourcees_attsdletp_do_not_emitd=letinstead_attsatts=letinstead_of=cps_of_string(attv"of"atts)inletuse=cps_of_string(attv"use"atts)inletbecause=attv"because"attsin{instead_of;use;because}inp_seqn_insteadinstead_attsdletp_ucdd=letdescription=refNoneinletrepertoire=refNoneinletblocks=refNoneinletnamed_sequences=refNoneinletprovisional_named_sequences=refNoneinletnormalization_corrections=refNoneinletstandardized_variants=refNoneinletcjk_radicals=refNoneinletemoji_sources=refNoneinletdo_not_emit=refNoneinletsetnrpd=if!r<>Nonethenerr(err_dupn)elser:=Some(pd)inwhile(Xmlm.peekd<>`El_end)domatchXmlm.inputdwith|`El_start(n,_)whenn=n_description->setndescriptionp_descriptiond|`El_start(n,_)whenn=n_repertoire->setnrepertoirep_repertoired|`El_start(n,_)whenn=n_blocks->setnblocksp_blocksd|`El_start(n,_)whenn=n_named_sequences->setnnamed_sequencesp_named_sequencesd|`El_start(n,_)whenn=n_provisional_named_sequences->setnprovisional_named_sequencesp_named_sequencesd|`El_start(n,_)whenn=n_normalization_corrections->setnnormalization_correctionsp_normalization_correctionsd|`El_start(n,_)whenn=n_standardized_variants->setnstandardized_variantsp_standardized_variantsd|`El_start(n,_)whenn=n_cjk_radicals->setncjk_radicalsp_cjk_radicalsd|`El_start(n,_)whenn=n_emoji_sources->setnemoji_sourcesp_emoji_sourcesd|`El_start(n,_)whenn=n_do_not_emit->setndo_not_emitp_do_not_emitd|`El_start(n,_)->skip_eld(* foreign markup *)|`Data_->errerr_data|_->assertfalsedone;ignore(Xmlm.inputd);ifnot(Xmlm.eoid)thenerrerr_wf;letsomevdefault=matchvwithSomev->v|None->defaultin{description=some!description"";repertoire=some!repertoireCpmap.empty;blocks=some!blocks[];named_sequences=some!named_sequences[];provisional_named_sequences=some!provisional_named_sequences[];normalization_corrections=some!normalization_corrections[];standardized_variants=some!standardized_variants[];cjk_radicals=some!cjk_radicals[];emoji_sources=some!emoji_sources[];do_not_emit=some!do_not_emit[];}typesrc=[`Channelofin_channel|`Stringofstring]typedecoder=Xmlm.inputletdecodersrc=letsrc=matchsrcwith`Strings->`String(0,s)|`Channel_ass->sinXmlm.make_input~strip:truesrcletdecoded_ranged=Xmlm.posd,Xmlm.posdletdecoded=tryignore(Xmlm.inputd);(* `Dtd *)beginmatchXmlm.inputdwith|`El_start(n,_)whenn=n_ucd->`Ok(p_ucdd)|`El_start(n,_)->err(err_exp_ucdn)|_->assertfalseend;with|Failuree->`Errore|Xmlm.Error(_,e)->`Error(Xmlm.error_messagee)